我试图将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变为这些小值。
答案 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的速度。 我希望这可以帮助你,我一直在寻找关于此的信息!
我想我不应该惹这个,也许只是解决它。