为了调试游戏,有时需要参考玩家的系统信息,试了下,发现用高精度计时器可以获得较为准确的结果。
(原代码作者不详,有改动)
//精确延时获得CPU频率
#include
<
windows.h
>
int CPU_Frequency( void ) // MHz
{
LARGE_INTEGER CurrTicks, TicksCount;
__int64 iStartCounter, iStopCounter;
DWORD dwOldProcessP = GetPriorityClass(GetCurrentProcess()); // 纪录和提高优先级
DWORD dwOldThreadP = GetThreadPriority(GetCurrentThread());
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
QueryPerformanceFrequency( & TicksCount);
QueryPerformanceCounter( & CurrTicks);
TicksCount.QuadPart /= 16 ;
TicksCount.QuadPart += CurrTicks.QuadPart;
__asm
{
rdtsc
mov DWORD PTR iStartCounter, EAX
mov DWORD PTR (iStartCounter + 4 ), EDX
}
while (CurrTicks.QuadPart < TicksCount.QuadPart)
QueryPerformanceCounter( & CurrTicks);
__asm
{
rdtsc
mov DWORD PTR iStopCounter, EAX
mov DWORD PTR (iStopCounter + 4 ), EDX
}
SetThreadPriority(GetCurrentThread(), dwOldThreadP);
SetPriorityClass(GetCurrentProcess(), dwOldProcessP);
return ( int )((iStopCounter - iStartCounter) / 62500 );
}
int CPU_Frequency( void ) // MHz
{
LARGE_INTEGER CurrTicks, TicksCount;
__int64 iStartCounter, iStopCounter;
DWORD dwOldProcessP = GetPriorityClass(GetCurrentProcess()); // 纪录和提高优先级
DWORD dwOldThreadP = GetThreadPriority(GetCurrentThread());
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
QueryPerformanceFrequency( & TicksCount);
QueryPerformanceCounter( & CurrTicks);
TicksCount.QuadPart /= 16 ;
TicksCount.QuadPart += CurrTicks.QuadPart;
__asm
{
rdtsc
mov DWORD PTR iStartCounter, EAX
mov DWORD PTR (iStartCounter + 4 ), EDX
}
while (CurrTicks.QuadPart < TicksCount.QuadPart)
QueryPerformanceCounter( & CurrTicks);
__asm
{
rdtsc
mov DWORD PTR iStopCounter, EAX
mov DWORD PTR (iStopCounter + 4 ), EDX
}
SetThreadPriority(GetCurrentThread(), dwOldThreadP);
SetPriorityClass(GetCurrentProcess(), dwOldProcessP);
return ( int )((iStopCounter - iStartCounter) / 62500 );
}
======================
另:从SYSTEM_INFO中便能获得核数、类型等CPU信息
GetSystemInfo(&siSysInfo);
|