Windows睡眠不一致?

时间:2013-05-30 04:24:04

标签: c++ winapi timer sleep

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

我不认为这是导致问题的opengl,因为它在我的计算机上以14,000 fps的速度运行。 (即使它以半速运行)

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

我尝试在Render()线程的末尾抛出一个Sleep(16)(也在它自己的线程上)。此操作应将fps限制在62左右。请记住,应用程序有时以预期的速度运行,有时以半速运行(我已尝试过我拥有的两台计算机并且它仍然存在)。

当它以预期的速度运行时,fps为62(良好),有时为31-ish(差)。它永远不会在半速和全速执行中间切换,即使重启后问题仍然存在。

因此,它不是导致缓慢的渲染,而是Sleep()函数

我想我说的是Sleep()函数与它实际睡眠的时间不一致。这是经证实的事吗?我可以使用更好的Sleep()函数吗?

4 个答案:

答案 0 :(得分:5)

等待定时器(CreateWaitableTimerWaitForSingleObject或朋友)对定期唤醒要好得多。

但是,在您的情况下,您可能应该只启用VSYNC。

答案 1 :(得分:1)

请参阅以下有关休眠功能的讨论,重点关注调度优先级: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx

答案 2 :(得分:1)

是的,睡眠功能不一致,在宏观情况下非常有用。 如果你想要一致性时间,请使用QueryPerformanceFrequency获取CPU的频率,并使用QueryPerformanceCount两次开始和结束,然后(end-start)/ frequency获取一致性时间,但你必须注意,如果你的CPU是多余的核心,开始和结束时间可能不是相同的CPU核心,所以请为我们的SetThreadAffinity工作线程设置相同的CPU核心。

答案 3 :(得分:0)

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

#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) {}