我的简单C ++应用程序(使用SDL)每隔3000毫秒约延迟60毫秒。使用144hz的VSYNC,滞后恰好每425帧(〜3000ms)发生一次。在144hz时,我的帧时间应该约为每帧7ms。每425帧(约3000毫秒),我的帧时间约为60毫秒。
我首先注意到滞后只是我使用键盘输入在屏幕上移动一个正方形所致-我每隔几秒钟就会感到口吃/跳动。当我开始将带有时间戳/帧计数的deltaTime输出到控制台时,我注意到滞后非常一致(〜60ms),并且发生得非常一致(〜3000ms,或者使用VSYNC在144hz时每425帧)。
我尝试禁用VSYNC,以全屏,窗口模式等运行我的应用程序。没有VSYNC,每个滞后的帧时间是可变的,但是〜3000ms的时间保持不变。我曾尝试在计算机上运行其他应用程序(视频游戏),以查看那里是否存在明显的时滞,而这种情况并没有。
我尝试卸载防病毒软件,但是仍然存在滞后。我尝试使用任务管理器关闭其他应用,而没有任何更改。我曾尝试关闭一些后台进程,但我不确定要关闭的进程,也没有尝试使用任务管理器关闭任何Windows进程,因为我不确定是什么导致不稳定。
我正在使用以下代码在控制台中跟踪我的deltaTime。我正在Lazy Foo(https://lazyfoo.net/tutorials/SDL/)教程#8的主循环(而!quit)中实现此代码。我添加了键盘移动和VSYNC,但我认为这没有什么不同,因为我还在他的教程2中尝试了以下deltaTime跟踪代码,并且延迟时间相同(每〜3000ms约60ms)。
注意:如果帧的deltaTime超过10ms,我只是输出deltaTime信息,只是为了保持干净的控制台输出。在执行此操作之前,我其他大多数deltaTime似乎都在7毫秒左右。
// Initialize tracking variables at the top of the file
Uint64 NOW = SDL_GetPerformanceCounter();
Uint64 LAST = 0;
double deltaTime = 0;
int frameCounter = 0;
int lastDeltaSpikeFrame = 0;
double timeCounter = 0;
double lastDeltaSpikeTime = 0;
// Use them in the application loop
while( !quit )
{
LAST = NOW;
NOW = SDL_GetPerformanceCounter();
deltaTime = (double)((NOW - LAST) * 1000 / (double)SDL_GetPerformanceFrequency());
frameCounter++;
timeCounter += deltaTime;
if (deltaTime > 10)
{
int frameChangeSinceLastSpike = frameCounter - lastDeltaSpikeFrame;
double timeChangeSinceLastSpike = timeCounter - lastDeltaSpikeTime;
printf("deltaTime = %f\ntimeCounter = %f\ntimeChangeSinceLastSpike = %f\nframeCounter = %i\nframeChangeSinceLastSpike = %i\n\n\n", deltaTime, timeCounter, timeChangeSinceLastSpike, frameCounter, frameChangeSinceLastSpike);
lastDeltaSpikeFrame = frameCounter;
lastDeltaSpikeTime = timeCounter;
// Rest of the application code...
这是控制台输出(过去第二帧,每〜3000ms约60ms的滞后时间变得一致):
deltaTime = 308.039800
timeCounter = 308.039800
timeChangeSinceLastSpike = 308.039800
frameCounter = 1
frameChangeSinceLastSpike = 1
deltaTime = 66.737300
timeCounter = 374.777100
timeChangeSinceLastSpike = 66.737300
frameCounter = 2
frameChangeSinceLastSpike = 1
deltaTime = 60.252300
timeCounter = 3369.369500
timeChangeSinceLastSpike = 2994.592400
frameCounter = 426
frameChangeSinceLastSpike = 424
deltaTime = 59.695400
timeCounter = 6368.786900
timeChangeSinceLastSpike = 2999.417400
frameCounter = 851
frameChangeSinceLastSpike = 425
deltaTime = 59.917200
timeCounter = 9369.138700
timeChangeSinceLastSpike = 3000.351800
frameCounter = 1276
frameChangeSinceLastSpike = 425
deltaTime = 60.112800
timeCounter = 12369.418100
timeChangeSinceLastSpike = 3000.279400
frameCounter = 1701
frameChangeSinceLastSpike = 425
...滞后时间(60ms)每隔〜3000 ms发生一次,超出此时间点恰好425帧。