我正在编写一个游戏引擎,我需要一种方法来获得一个精确和准确的“deltatime”值,从中得出当前的 FPS 进行调试并限制帧速率(这对我们的项目很重要)。
做了一些研究,我发现最好的方法之一是使用 WinAPI 的QueryPerformanceCounter
函数。GetTicksCount
必须用来防止向前反跳,但它本身不是很准确。
现在,问题QueryPerformanceCounter
在于,它显然可能会返回看起来像时间扭曲的值(即,相对于过去的另一个调用,调用可能会在时间上返回一个更早的值)。仅当将使用给定处理器内核获得的值与使用另一个处理器内核获得的值进行比较时才会发生这种情况,这使我想到了促使我发表这篇文章的终极问题:
- 操作系统可以在线程已经运行时将线程“重新分配”到另一个内核,还是将线程分配给给定的内核,直到线程死亡?
- 如果无法重新分配线程(至少对我来说很有意义),那么为什么我可以做类似的事情
SetThreadAffinityMask(GetCurrentThread(),mask)
?Ogre3D在其Ogre::Timer 类 (Windows implementation)中做到这一点,我假设这是为了避免时间倒退。但要做到这一点,我将不得不考虑操作系统任意将线程从一个内核移动到另一个内核的可能性,这对我来说似乎很奇怪(不知道为什么)。
我想这就是我现在想知道的。谢谢。