SDL3无边框窗口调整大小时出现白色条纹问题求助
SDL3无边框可缩放窗口调整大小出现白色条纹的解决方案
你的代码存在几个核心问题,导致调整窗口时出现未刷新的白色条纹,以下是问题分析和修复方案:
问题根源
- 缺少窗口刷新逻辑:SDL3中,窗口内容需要主动通过渲染器或表面更新,你的主循环只处理事件,没有任何渲染/刷新操作,调整窗口时未更新的区域会残留默认的白色背景。
- 未处理窗口尺寸变化事件:窗口被调整大小时,SDL会发送
SDL_EVENT_WINDOW_RESIZED事件,你需要同步更新渲染目标的尺寸,否则渲染区域和窗口实际尺寸不匹配。 - 代码基础错误:
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
相关产品推荐
相关产品推荐

