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