SDL_Delay影响SDL_GetTicks

时间:2014-08-20 15:49:18

标签: c++ time sdl delay frame-rate

我试图将SDL程序限制为60 FPS并使用以下代码计算FPS:

static const Uint32 min_frame_time = 16;
Uint32 start_time = SDL_GetTicks();

// Rendering stuff...

time_delta = SDL_GetTicks() - start_time;
fps_sum += 1000.0 / (float)time_delta;
fps_count++;

if(fps_count >= fps_max_count)
{
    printf("FPS: %f\n", fps_sum / (float)fps_count);
    fps_count = 0;
    fps_sum = 0.0;
}

if(time_delta < min_frame_time)
    SDL_Delay(min_frame_time - time_delta);

但似乎SDL_Delay会以某种方式影响SDL_GetTicks的返回值,因此time_delta会获得0到3之类的值,而当我只删除最后2行时,它通常大约为15。

对我来说,这毫无意义。有谁知道什么是错的?

编辑:

上面的代码基本上是我程序的主循环。我首先通过在start_time中渲染场景之前保存时间来实现fps计数器,然后计算多个循环的平均fps,这些循环工作正常。

然后,我添加了最后两行来将fps限制为60.因此,如果渲染速度比min_frame_time快,则程序应该等待剩余的时间。但是在添加之后,除了第一个循环之外的所有循环的SDL_GetTicks()的结果变得奇怪,所以如上所述,delta变为这些小值。

2 个答案:

答案 0 :(得分:0)

根据你所展示的内容,在这里稍作猜测。

在启用VSync的情况下运行窗口或全屏时,SDL_RenderPresent将等待垂直同步。此等待将在您的定时代码中发生,因此您会在time_delta = 15附近看到值。使用SDL_Delay,您将手动等待,直到接近或等到下一个vsync,但此等待超出了您的时间。因此,下次渲染它时不必等待,或者不必等待很长时间,以便下一次vsync发生,并且您可以更快地完成渲染循环。

答案 1 :(得分:0)

Google Chrome等一些程序。将SystemclockResolution设置为15ms。 有办法解决这个问题。

Sleep(1) and SDL_Delay(1) takes 15 ms

但如果我理解正确的话,它会减慢CPU每1ms的速度。 我希望这可以帮助你,我一直在寻找关于此的信息!

我想我不应该惹这个,也许只是解决它。