gpt4 book ai didi

c++ - 当前线程的线程关联掩码更改有什么好处?

转载 作者:太空狗 更新时间:2023-10-29 21:08:54 27 4
gpt4 key购买 nike

我正在编写一个游戏引擎,我需要一种方法来获取精确且准确的“deltatime”值,从中导出当前 FPS 以进行调试并限制帧速率(这对我们的项目很重要)。

经过一些研究,我发现执行此操作的最佳方法之一是使用 WinAPI 的 QueryPerformanceCounter 函数。 GetTicksCount 必须用于防止 forward counter leaps , 但它本身并不是很准确。

现在,QueryPerformanceCounter 的问题在于,它显然可能会返回看起来像时间倒转的值(即,一个调用可能会返回一个相对于过去另一个调用在时间上更早的值) .仅当将使用给定处理器内核获得的值与使用另一个处理器内核获得的值进行比较时,才会发生这种情况,这引出了促使我发表这篇文章的最终问题:

  1. 操作系统是否可以在线程已在运行时将线程“重新分配”给另一个内核,或者线程是否已分配给给定内核,直到线程死亡?
  2. 如果无法重新分配线程(至少对我来说这很有意义),那么为什么我可以执行类似 SetThreadAffinityMask(GetCurrentThread(),mask)? Ogre3D在其 Ogre::Timer class (Windows implementation) 中执行此操作,我假设这是为了避免时间倒流。但如果这是真的,那么我将不得不考虑操作系统将线程从一个内核任意移动到另一个内核的可能性,这对我来说似乎很奇怪(不确定为什么)。

我想这就是我现在想知道的全部内容。谢谢。

最佳答案

除非线程有处理器关联掩码,否则调度程序会将其从一个处理器移动到另一个处理器,以便为其提供执行时间。由于在处理器之间移动一个线程会降低性能,它会尝试不移动它,但是给它一个处理器来执行比不移动它具有优先权。所以,通常线程会移动。

至于定时器api。 timeGetTime专为多媒体计时而设计,因此它比 GetTickCount 更准确。

QueryPerformanceCounter(). 仍然是您最精确的度量。微软对此有话要说。

On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL). To specify processor affinity for a thread, use the SetThreadAffinityMask function.

因此,如果您在特定计算机上进行时序测试,您可能不必担心 QPC 倒退,您应该进行一些测试,看看它是否对您的计算机有影响。

关于c++ - 当前线程的线程关联掩码更改有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2194904/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com