我正在将最初为 Win32 API 编写的游戏移植到 Linux(嗯,将 Win32 端口的 OS X 端口移植到 Linux)。
我已经实现了 QueryPerformanceCounter
,方法是在进程启动后给出 uSeconds:
BOOL QueryPerformanceCounter(LARGE_INTEGER* performanceCount)
{
gettimeofday(¤tTimeVal, NULL);
performanceCount->QuadPart = (currentTimeVal.tv_sec - startTimeVal.tv_sec);
performanceCount->QuadPart *= (1000 * 1000);
performanceCount->QuadPart += (currentTimeVal.tv_usec - startTimeVal.tv_usec);
return true;
}
加上 QueryPerformanceFrequency()
给出一个常数 1000000 作为频率,在我的机器上运行良好,给我一个包含 的 64 位变量自程序启动以来的 uSeconds
。
所以这是可移植的吗?我不想发现如果内核以某种方式或类似的方式编译,它的工作方式会有所不同。不过,我觉得它不能移植到 Linux 以外的东西上。
最佳答案
也许吧。但是你有更大的问题。 gettimeofday()
如果您的系统上存在更改计时器的进程(即ntpd),可能会导致计时不正确。不过,在“普通”Linux 上,我相信 gettimeofday()
的分辨率是 10us。因此,它可以根据系统上运行的进程向前和向后跳跃和时间。这有效地回答了您的问题。
您应该查看 clock_gettime(CLOCK_MONOTONIC)
的时间间隔。由于多核系统和外部时钟设置等原因,它遇到的问题较少。
另外,查看 clock_getres()
函数。
关于linux - gettimeofday() 是否保证为微秒级分辨率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/88/