window 调整大小后,SDL2 无法正确呈现
SDL2 does not render properly after window resize
window 尺寸增大后我无法在其上绘图。
我仍然可以借鉴旧的部分。
例如,我有一个 100x100 window,我将其大小 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 window 并将其着色为红色,然后等待 3 秒。
- 将 window 大小增加到 800x800 并将其着色为绿色,然后等待 3 秒。
- 将相同的 window 涂成蓝色,然后等待 3 秒。
代码实际执行的操作:
- 创建一个 100x100 window 并将其着色为红色,然后等待 3 秒。
- 将 window 大小增加到 800x800 并且颜色 只有一个 100x100 正方形 为绿色然后等待 3 秒。
- 将相同的 window 涂成蓝色,然后等待 3 秒。
当我在 SDL_RenderPresent() 之前添加 100 毫秒的延迟时,它可以正常工作。
但是,我在我的一个项目中遇到了同样的问题,我必须使用 200 毫秒的延迟才能工作。
为什么渲染前需要延迟?
有没有办法知道SDL_RenderPresent()之前要等多少时间?
我发现了你的问题!
当您创建 window 时,您需要传递标志 SDL_WINDOW_RESIZABLE
。像这样:
SDL_Window *win = SDL_CreateWindow("test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 100, 100, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE );
进行此更改,您的 window 将正常运行。
window 尺寸增大后我无法在其上绘图。 我仍然可以借鉴旧的部分。 例如,我有一个 100x100 window,我将其大小 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 window 并将其着色为红色,然后等待 3 秒。
- 将 window 大小增加到 800x800 并将其着色为绿色,然后等待 3 秒。
- 将相同的 window 涂成蓝色,然后等待 3 秒。
代码实际执行的操作:
- 创建一个 100x100 window 并将其着色为红色,然后等待 3 秒。
- 将 window 大小增加到 800x800 并且颜色 只有一个 100x100 正方形 为绿色然后等待 3 秒。
- 将相同的 window 涂成蓝色,然后等待 3 秒。
当我在 SDL_RenderPresent() 之前添加 100 毫秒的延迟时,它可以正常工作。 但是,我在我的一个项目中遇到了同样的问题,我必须使用 200 毫秒的延迟才能工作。
为什么渲染前需要延迟? 有没有办法知道SDL_RenderPresent()之前要等多少时间?
我发现了你的问题!
当您创建 window 时,您需要传递标志 SDL_WINDOW_RESIZABLE
。像这样:
SDL_Window *win = SDL_CreateWindow("test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 100, 100, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE );
进行此更改,您的 window 将正常运行。