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

SDL绘制矩形消失问题:按键新增形状时应如何正确更新窗口?

问题结论

不推荐直接移除SDL_RenderClear解决该问题,这是错误的治标方案。

为什么不能删SDL_RenderClear

SDL_RenderClear的核心作用是每一帧绘制前清空整个渲染缓冲区,清除上一帧的残留画面。如果直接移除会出现大量后续问题:

  • 画面出现拖影、旧内容无法清除的残留问题
  • 动态元素移动时会留下大量重影轨迹
  • 多图层绘制时会出现画面叠加混乱的问题

代码问题根源

当前绘制逻辑存在两个明显错误:

  1. SDL_KEYDOWN事件仅会在按键按下的瞬间触发一次,你只在事件触发的那一帧绘制额外矩形,后续帧清屏后没有再执行矩形绘制逻辑,自然会消失
  2. 你把按键判断写在了事件循环之外,e变量最终存储的是事件队列的最后一个事件,大部分帧里e.type都不是SDL_KEYDOWN,自然不会触发绘制逻辑

正确解决方案

新增一个状态变量标记是否需要显示额外矩形,按键触发时修改状态,每一帧都根据状态决定是否绘制对应矩形,参考修正后代码:

// 新增状态变量,标记是否显示额外矩形
bool showExtraRect = false;

while (!quit) {
  while (SDL_PollEvent(&e) != 0) {
    if (e.type == SDL_QUIT)
      quit = true;
    // 把事件判断放到事件循环内部,按下右键修改状态
    if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_RIGHT) {
      showExtraRect = true;
    }
  }

  SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
  SDL_RenderClear(gRenderer);

  // 绘制固定矩形
  SDL_Rect fillRect = {
    0,
    0,
    SCREEN_WIDTH / 5 - 5,
    SCREEN_HEIGHT / 5 - 5
  };
  SDL_SetRenderDrawColor(gRenderer, 255, 205, 51, 0xFF);
  SDL_RenderFillRect(gRenderer, &fillRect);

  // 每帧根据状态判断是否绘制额外矩形
  if (showExtraRect) {
    SDL_Rect extraRect = {
      0,
      200,
      SCREEN_WIDTH / 5 - 5,
      SCREEN_HEIGHT / 5 - 5
    };
    SDL_SetRenderDrawColor(gRenderer, 255, 205, 51, 0xFF);
    SDL_RenderFillRect(gRenderer, &extraRect);
  }

  SDL_RenderPresent(gRenderer);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:36:02