如何像 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