我正在将一个最初为Win32 API编写的游戏移植到Linux(很好,是将Win32端口的OS X端口移植到Linux)。
QueryPerformanceCounter自程序启动以来,我已经通过提供uSeconds来实现:
QueryPerformanceCounter
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作为频率,可以 在我的机器上 很好地工作,并为我提供了一个uSeconds自程序启动以来包含的64位变量。
QueryPerformanceFrequency()
uSeconds
这 是便携式的吗? 我不想发现以某种方式或类似方式编译内核时,它的工作原理有所不同。我可以将其移植到Linux以外的其他软件上,这很好。
也许。但是你有更大的问题。gettimeofday()如果系统上有更改计时器的进程(即ntpd),则可能会导致计时不正确。但是,在“普通” Linux上,我相信的分辨率gettimeofday()为10us。因此,它可以根据系统上运行的进程向前和向后跳转,并可以跳转。有效地回答了您的问题。
gettimeofday()
您应该查看clock_gettime(CLOCK_MONOTONIC)时间间隔。由于诸如多核系统和外部时钟设置之类的问题,它遇到的问题更少。
clock_gettime(CLOCK_MONOTONIC)
另外,查看该clock_getres()功能。
clock_getres()