C++ SDL_延迟会影响SDL_获取

C++ SDL_延迟会影响SDL_获取,c++,time,sdl,delay,frame-rate,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 >= fp

我试图将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_延迟似乎在某种程度上影响了SDL_GetTicks的返回值,因此time_delta的值从0到3不等,而当我只删除最后两行时,它通常是15左右

对我来说,这毫无意义。有人知道怎么了吗

编辑:

上面的代码基本上是我程序的主循环。我首先实现了一个fps计数器,它节省了在开始时间渲染场景之前的时间,并计算了多个循环的平均fps(工作正常)


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

根据您所展示的,这里将进行一个小小的猜测


当在启用VSync的情况下运行windowed或fullscreen时,SDL_RenderPresent将等待垂直同步。此等待将发生在计时代码中,因此您可以在大约时间_delta=15处看到值。使用SDL_延迟,您将手动等待,直到接近下一个vsync或在下一个vsync之后,但这种等待超出了您的计时范围。因此,下次渲染时,无需等待,也无需等待很长时间,即可进行下一次vsync,并且渲染循环的运行速度更快。

一些程序,如Google Chrome。将系统时钟分辨率设置为15毫秒。 这是有办法的

但是如果我理解正确的话,它会让CPU每1ms慢一次。 我希望这能帮助你,我一直在寻找有关这方面的信息有一段时间了


我想我不应该把这件事搞砸,也许可以解决一下。

我不明白你的问题。你能不能编辑一下,详细说明一下你所看到的,有没有耽搁。还有,是在循环之间吗?谢谢你的回答,但这里不是这样。我只使用OpenGL绘制所有内容,它不会自动等待VSync。通过禁用一些阴影贴图的东西,我可以获得比60帧多得多的FPS。@Florian好的,那就不是这个了。我会把答案留在这里,让其他人看看,谁知道呢,它可能会帮助别人。