如何像pygame一样限制sdl2 fps

时间:2017-09-22 07:53:30

标签: c++ c sdl-2

当我像这样编写我的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()后我通过睡眠时间会使我的编程完全冻结,并且“没有响应”。

我不想使用SDL_WaitEvent()因为我的程序会显示无论输入事件如何都会运行的动画。

是否有任何等同于pygame的既不阻止输入也不阻止视频线程

fpsClock = pygame.time.Clock()
while(True):
    pygame.display.update()
    fpsClock.tick(60)

1 个答案:

答案 0 :(得分:2)

您是否检查过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 examplesee also