在写游戏时钟类时,应确保时钟的计算是以某个固定的CPU为标准的。下面通过一个例子来阐述如何实现这一思想:
// 记录特定进程的affinity mask unsigned long lProcessAffinityMask; // 记录系统的affinity mask unsigned long lSystemAffinityMask; ::GetProcessAffinityMask(::GetCurrentProcess(), &lProcessAffinityMask, &lSystemAffinityMask); // 将指定线程(此处以当前线程为例)限定在第1个CPU上执行 ::SetThreadAffinityMask(::GetCurrentThread(), 1); // 获取当前CPU(第1个CPU)每秒tick的次数 LARGE_INTEGER lpFrequency; ::QueryPerformanceFrequency(&lpFrequency); // 获取程序执行到现在的时间 LARGE_INTEGER lpCountStart; ::QueryPerformanceCounter(&lpCountStart); // 将指定线程限定在任意CPU(GetProcessAffinityMask返回的CPU mash集)上执行 ::SetThreadAffinityMask(::GetCurrentThread(), lProcessAffinityMask); // do something... ::SetThreadAffinityMask(::GetCurrentThread(), 1); // 获取程序执行到现在的时间 LARGE_INTEGER lpCountEnd; ::QueryPerformanceCounter(&lpCountEnd); ::SetThreadAffinityMask(::GetCurrentThread(), lProcessAffinityMask); int timeElasped=( ((lpCountEnd.QuadPart - lpCountStart.QuadPart) * 1000)/lpFrequency.QuadPart); cout<<timeElasped<<endl;
我们可以看到,获取CPU时钟相关的代码段都被指定在了是在CPU0(即第1个CPU)上执行的(代码段的线程被指定在第1个CPU),这就确保了时钟的统一性。