在写游戏时钟类时,应确保时钟的计算是以某个固定的CPU为标准的

在写游戏时钟类时,应确保时钟的计算是以某个固定的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),这就确保了时钟的统一性。

posted @ 2011-06-01 13:58  斯芬克斯  阅读(844)  评论(0编辑  收藏  举报