如何像 pygame 一样限制 sdl2 fps
how to cap sdl2 fps just like pygame
当我像这样编写我的 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%
而当我在计算到 SDL_Delay()
的时差后通过睡眠时间时,我的程序完全冻结 'not responding'。
我不想使用 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。
当我像这样编写我的 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%
而当我在计算到 SDL_Delay()
的时差后通过睡眠时间时,我的程序完全冻结 'not responding'。
我不想使用 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。