当我像这样编写我的 SDL2 OpenGL 程序时(使用 VSync):
SDL_GL_SetSwapInterval(1);
while(isRunning)
{
while(SDL_PollEvent(&e))
{
if(e.type == SDL_Quit)
{
isRunning = false;
}
}
SDL_GL_SwapWindow(window);
}
对于这个实际上什么都不做的单个程序,我的 CPU 使用率高达 39%-50%
而当我在计算时间差后将 sleep 时间传递给 SDL_Delay()
时,我的程序将完全卡住并出现“无响应”。
我不想使用 SDL_WaitEvent()
,因为我的程序将显示无论输入事件如何都会运行的动画。
是否有与 pygame 的等效项,既不阻塞输入也不阻塞视频线程
fpsClock = pygame.time.Clock()
while(True):
pygame.display.update()
fpsClock.tick(60)
最佳答案
您是否检查过对 SDL_GL_SetSwapInterval(1)
的调用是否成功?如果您的调用成功,您的 FPS 应该以刷新率为上限。
您是否在 SDL 中正确初始化了 OpenGL 以实现双缓冲?像这样for exmaple :
SDL_Window *window;
SDL_GLContext context;
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
window = SDL_CreateWindow("OpenGL Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_OPENGL);
if (!window) {
fprintf(stderr, "Couldn't create window: %s\n", SDL_GetError());
return;
}
context = SDL_GL_CreateContext(window);
if (!context) {
fprintf(stderr, "Couldn't create context: %s\n", SDL_GetError());
return;
}
int r, g, b;
SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &r);
SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &g);
SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &b);
printf("Red size: %d, Green size: %d, Blue size: %d\n", r, g, b);
SDL不是一个框架,没有像帧率控制这样的高级功能。但是,您应该为 VSync 设置帧速率上限。如果没有上限,则可能意味着 VSync 不工作。
请考虑查看有关如何在 SDL 中设置 OpenGL 应用程序的更深入的教程,this for example , see also .
关于c++ - 如何像pygame一样限制sdl2 fps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46359600/