调整窗口大小后,SDL2无法正确呈现

时间:2020-01-15 16:14:23

标签: c sdl sdl-2

增加窗口大小后,我无法在窗口上绘画。 我仍然可以借鉴旧的内容。 例如,我有一个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的窗口并将其着色为红色,然后等待3s。
  • 将窗口大小增加到800x800,然后将其涂成绿色,然后等待3秒。
  • 将同一窗口染成蓝色,然后等待3秒。

代码实际上是这样做的:

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

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

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

1 个答案:

答案 0 :(得分:0)

我发现了你的问题!

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

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

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