为什么我的睡眠时间很远,而其他人 (Urho3D) 是准确的

问题描述

我正在使用“睡眠”来实现某种帧时间控制,但到目前为止我得到的结果还差得很远。

#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 (将#修改为@)