Windows睡眠不一致
Windows Sleep inconsistency?
我在使用opengl制作游戏时遇到了一点问题。游戏有时会以半速运行,有时会正常运行。
我不认为是opengl导致了这个问题,因为它在我的电脑上以14000 fps的速度运行。(即使在半速运行时)
这让我相信这是"游戏计时器"导致的问题。游戏计时器运行在一个单独的线程上,并被编程为在"循环"结束时使用Sleep(5)调用暂停。如果我删除Sleep(5)调用,它运行得如此之快,以至于我几乎看不到屏幕上的精灵。(可预测的行为)
我试着在Render()线程结束时抛出一个Sleep(16)(也在它自己的线程上)。这个动作应该将fps限制在62左右。请记住,该应用程序有时以其预期速度运行,有时以一半速度运行(我在我拥有的两台计算机上都尝试过,它仍然存在)。
当它以预期的速度运行时,fps是62(好),有时是31(坏)。它不会在半速和全速之间切换,甚至在重新启动后问题仍然存在。
所以不是渲染导致慢,而是Sleep()函数
我猜我说的是Sleep()函数与它实际睡觉的时间不一致。这是一个被证明的事情吗?有一个更好的睡眠()函数,我可以使用?
可等待定时器(CreateWaitableTimer
和WaitForSingleObject
或朋友)对于周期性唤醒来说要好得多。
然而,在你的情况下,你可能应该只启用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) {}
- 大于65535的C++数组[size]引发不一致的溢出
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- CreateDIBSection为同一图像返回不一致的位图位值
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 这种比较是否不一致(或者存在其他问题)?
- 以下可变参数模板行为是否不一致?
- 如何修复我的链表读数不一致的问题?
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- void 函数中的指针参数返回不一致的值
- 如何查找导致结果不一致的代码
- 为什么Qt资源被加载到Linux而不是Windows中?
- QSHaredMemory在Windows中的行为不一致
- Windows睡眠不一致