问题描述
我正在使用“睡眠”来实现某种帧时间控制,但到目前为止我得到的结果还差得很远。
#include <iostream>
#include <chrono>
#include <thread>
#include <Windows.h>
int main(int argc,char** argv) {
for (int i = 0; i < 100; i++) {
auto old = std::chrono::system_clock::Now();
//std::this_thread::sleep_for(std::chrono::milliseconds(33));
::Sleep(33u);
auto Now = std::chrono::system_clock::Now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(Now - old).count() << std::endl;
}
return 0;
}
此代码(使用 ::Sleep 或 std sleep)在我的 PC(Win10)上打印的平均值高于 45。我不知道我错过了什么。它是否连接到某些秘密线程/进程设置?
*在 WSL 中编译和运行时,它是准确的、奇怪的。
我查看了 Urho3D 的代码。它看起来并不比我的更漂亮,但神奇地精确到毫秒。
// Sleep if 1 ms or more off the frame limiting goal
if (targetMax - elapsed >= 1000LL)
{
auto sleepTime = (unsigned)((targetMax - elapsed) / 1000LL);
Time::Sleep(sleepTime); // calls ::Sleep on Windows
}
感谢 Alan 指出第二个相关问题的最佳答案解决了问题。显然我必须在 Windows 上调用 timeBeginPeriod 才能完成这项工作。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)