Windows睡眠不一致

Windows Sleep inconsistency?

本文关键字:不一致 Windows      更新时间:2023-10-16

我在使用opengl制作游戏时遇到了一点问题。游戏有时会以半速运行,有时会正常运行。

我不认为是opengl导致了这个问题,因为它在我的电脑上以14000 fps的速度运行。(即使在半速运行时)

这让我相信这是"游戏计时器"导致的问题。游戏计时器运行在一个单独的线程上,并被编程为在"循环"结束时使用Sleep(5)调用暂停。如果我删除Sleep(5)调用,它运行得如此之快,以至于我几乎看不到屏幕上的精灵。(可预测的行为)

我试着在Render()线程结束时抛出一个Sleep(16)(也在它自己的线程上)。这个动作应该将fps限制在62左右。请记住,该应用程序有时以其预期速度运行,有时以一半速度运行(我在我拥有的两台计算机上都尝试过,它仍然存在)。

当它以预期的速度运行时,fps是62(好),有时是31(坏)。它不会在半速和全速之间切换,甚至在重新启动后问题仍然存在。

所以不是渲染导致慢,而是Sleep()函数

我猜我说的是Sleep()函数与它实际睡觉的时间不一致。这是一个被证明的事情吗?有一个更好的睡眠()函数,我可以使用?

可等待定时器(CreateWaitableTimerWaitForSingleObject或朋友)对于周期性唤醒来说要好得多。

然而,在你的情况下,你可能应该只启用VSYNC

参见以下关于Sleep函数的讨论,重点关注调度优先级:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298 (v = vs.85) . aspx

是的,Sleep函数是不一致的,它在宏观条件的情况下非常有用。如果你想要一个一致性时间,请使用queryperformancfrequency得到CPU的频率,queryperformancount两次开始和结束,然后(end-start)/frequency得到一致性时间,但是你必须注意,如果你的CPU是多核的,开始和结束时间可能不是同一个CPU核心,所以请我们SetThreadAffinity为你的工作线程设置相同的CPU核心。

有同样的问题。因为我刚刚制定了自己的睡眠逻辑,并为我工作。

#include <chrono>
using namespace std::chrono;
high_resolution_clock::time_point sleep_start_time = high_resolution_clock::now();    
while (duration_cast<duration<double>>(high_resolution_clock::now() - sleep_start_time).count() < must_sleep_duration) {}