【问题标题】:SDL2 does not render properly after window resize调整窗口大小后 SDL2 无法正确呈现
【发布时间】:2020-01-15 16:14:23
【问题描述】:

增加窗口大小后,我无法在窗口上绘图。 我仍然可以在旧的部分上画画。 例如,我有一个 100x100 的窗口,我使用 SDL_SetWindowSize 将其大小增加到 200x200。 我可以绘制到旧的 100x100 区域,但新区域无法使用,除非我在使用前使用延迟。

这里是使用 SDL_RenderClear 的问题示例:

int main(void)
{
        SDL_Init(SDL_INIT_VIDEO);

        SDL_Window *win = SDL_CreateWindow("test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 100, 100, SDL_WINDOW_SHOWN);
        SDL_Renderer *rend = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);

        /* Draw red window */
        SDL_SetRenderDrawColor(rend, 255, 0, 0, 255);
        SDL_RenderClear(rend);
        SDL_RenderPresent(rend); // Completely red

        SDL_Delay(3000);

        /* Increase window size and draw it green */
        SDL_SetWindowSize(win, 800, 800);
        SDL_SetRenderDrawColor(rend, 0, 255,0, 255);
        SDL_RenderClear(rend);
        SDL_RenderPresent(rend); // Partially green

        SDL_Delay(3000);

        /* Make window blue */
        SDL_SetRenderDrawColor(rend, 0, 0, 255, 255);
        SDL_RenderClear(rend);
        SDL_RenderPresent(rend); // Completely blue

        SDL_Delay(3000);

        SDL_DestroyRenderer(rend);
        SDL_DestroyWindow(win);
        SDL_Quit();
        return 0;
}

这段代码应该:

  • 创建一个 100x100 的窗口并将其涂成红色,然后等待 3 秒。
  • 将窗口大小增加到 800x800 并将其着色为绿色,然后等待 3 秒。
  • 将同一窗口涂成蓝色,然后等待 3 秒。

代码实际上做了:

  • 创建一个 100x100 的窗口并将其涂成红色,然后等待 3 秒。
  • 将窗口大小增加到 800x800,并将仅 100x100 的正方形涂成绿色,然后等待 3 秒。
  • 将同一窗口涂成蓝色,然后等待 3 秒。

当我在 SDL_RenderPresent() 之前添加 100 毫秒延迟时,它可以正常工作。 但是,我的一个项目也遇到了同样的问题,我必须使用 200 毫秒的延迟才能让它工作。

为什么在渲染之前需要延迟? 有什么方法可以知道在 SDL_RenderPresent() 之前要等待多少时间?

【问题讨论】:

  • 尝试使用实际的SDL_PollEvent()/SDL_WaitEvent() 循环,或至少SDL_PumpEvents()SDL_Delay() 并希望在现代复合窗口系统上获得最好的结果。

标签: c sdl sdl-2


【解决方案1】:

我发现了你的问题!

创建窗口时,需要传递标志SDL_WINDOW_RESIZABLE。像这样:

    SDL_Window *win = SDL_CreateWindow("test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 100, 100, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE );

进行此更改,您的窗口将正常运行。

【讨论】:

  • 它也对我有用,但如果我移动小窗口,创建较大的窗口时它没有颜色(大部分时间)。
  • 如果您只需要知道这些,请将我的回答标记为已接受,否则,我正在等待您的回复。
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 2012-05-22
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多