【发布时间】:2017-09-07 23:35:50
【问题描述】:
我使用以下代码初始化 SDL:
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* win = SDL_CreateWindow(
"SDL Window",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
WIDTH,
HEIGHT,
SDL_WINDOW_SHOWN
);
SDL_Renderer* ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_SOFTWARE);
SDL_GL_SetSwapInterval(1); // probably has no effect since it's not using GL
然后我使用非 SDL 软件渲染器进行渲染,并使用以下代码将其呈现给窗口:
SDL_UpdateTexture(screenBuffer, NULL, screenData, WIDTH*4);
SDL_RenderClear(ren);
SDL_RenderCopy(ren, screenBuffer, NULL, NULL);
SDL_RenderPresent(ren);
帧率完全没有上限,我不知道为什么。
将| SDL_RENDERER_PRESENTVSYNC 添加到 SDL_CreateRenderer 标志只会使窗口变成一个空白屏幕。虽然我需要使用 SDL_RENDERER_SOFTWARE 标志(即使我没有使用 SDL 的软件渲染器来呈现屏幕),否则 SDL_RenderPresent() 会停止很长时间,导致每秒大约 1 帧.
如何让SDL_RenderPresent() 等待垂直同步,或者自己(准确地)等待?
【问题讨论】:
-
SDL 的 UpdateWindowSurface 似乎没有 vsync 支持(我想这在某些平台上可能非常困难,而在其他平台上则不太可能),因此 SDL 软件渲染器也没有。不过,Vsync 在 3d API 上非常强大,因此解决您的减速问题可能会更简单。
-
我不希望依赖 GPU API 浪费二进制空间并降低兼容性。
-
@genpfault 是的,感谢您的关注。我会重新发表评论。
-
改用
SDL_SetHint(SDL_HINT_RENDER_VSYNC, "1");。SDL_GL_SetSwapInterval似乎仅适用于 GL 上下文。
标签: c++ windows-10 sdl-2 vsync