You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDL3无边框窗口调整大小时出现白色条纹问题求助

SDL3无边框可缩放窗口调整大小出现白色条纹的解决方案

你的代码存在几个核心问题,导致调整窗口时出现未刷新的白色条纹,以下是问题分析和修复方案:

问题根源

  1. 缺少窗口刷新逻辑:SDL3中,窗口内容需要主动通过渲染器或表面更新,你的主循环只处理事件,没有任何渲染/刷新操作,调整窗口时未更新的区域会残留默认的白色背景。
  2. 未处理窗口尺寸变化事件:窗口被调整大小时,SDL会发送SDL_EVENT_WINDOW_RESIZED事件,你需要同步更新渲染目标的尺寸,否则渲染区域和窗口实际尺寸不匹配。
  3. 代码基础错误:sdlWindow、sdlEvent等变量未声明,InTitle等参数未定义,这些会导致编译失败,也是程序运行异常的潜在原因。

修复后的完整代码

#include "SDL3/SDL.h"
#include "SDL3/SDL_system.h"

int main(int argc, char* argv[]) {
    // 初始化SDL视频子系统
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL初始化失败: %s", SDL_GetError());
        return 1;
    }

    // 定义窗口参数
    const char* InTitle = "SDL3无边框窗口";
    int InWidth = 800;
    int InHeight = 600;
    SDL_Window* sdlWindow = NULL;
    SDL_Event sdlEvent;
    SDL_Renderer* renderer = NULL;

    // 创建无边框可缩放窗口
    unsigned int sdlFlags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_BORDERLESS;
    sdlWindow = SDL_CreateWindow(InTitle, InWidth, InHeight, sdlFlags);
    if (!sdlWindow) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "创建窗口失败: %s", SDL_GetError());
        SDL_Quit();
        return 1;
    }

    // 创建关联窗口的渲染器,开启垂直同步
    renderer = SDL_CreateRenderer(sdlWindow, NULL);
    if (!renderer) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "创建渲染器失败: %s", SDL_GetError());
        SDL_DestroyWindow(sdlWindow);
        SDL_Quit();
        return 1;
    }
    SDL_SetRenderVSync(renderer, 1);

    bool running = true;
    while (running) {
        // 处理所有待处理事件
        while (SDL_PollEvent(&sdlEvent)) {
            switch (sdlEvent.type) {
                case SDL_EVENT_WINDOW_CLOSE_REQUESTED:
                    running = false;
                    break;
                case SDL_EVENT_WINDOW_RESIZED:
                    // 窗口尺寸变化时,重置渲染视口为整个窗口
                    SDL_SetRenderViewport(renderer, NULL);
                    break;
                default:
                    break;
            }
        }

        // 渲染流程:清除窗口背景(这里用黑色填充)
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);

        // 在此添加你的自定义绘制逻辑

        // 将渲染结果提交到窗口显示
        SDL_RenderPresent(renderer);
    }

    // 清理资源
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(sdlWindow);
    SDL_Quit();

    return 0;
}

关键修复说明

  • 添加标准SDL框架流程:包含初始化、资源创建、事件循环、渲染、资源清理的完整流程,这是SDL程序的基础规范。
  • 强制窗口刷新:通过SDL_RenderClear清除旧内容,SDL_RenderPresent提交新帧,确保窗口每帧都被更新,避免残留未刷新区域。
  • 适配窗口尺寸变化:监听SDL_EVENT_WINDOW_RESIZED事件,重置渲染视口,保证渲染区域和窗口实际尺寸一致。
  • 开启垂直同步:减少画面撕裂和异常刷新,让渲染节奏和显示器刷新率同步。

内容的提问来源于stack exchange,提问作者DirtyCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:57:29