LARGE_INTEGER frequency, count, oldCount, oldOldCount;
DWORD_PTR _procMask;
DWORD_PTR _sysMask;
DWORD_PTR _mask;
GetProcessAffinityMask(GetCurrentProcess(), &_procMask, &_sysMask);
if( _procMask == 0x00000000)
_procMask = 0x00000001;
_mask = 0x00000001;
while((_mask & _procMask) == 0)
{
_mask <<= 1;
}
HANDLE _thread = GetCurrentThread();
DWORD_PTR _oldMask = SetThreadAffinityMask(_thread, _mask);
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&count);
SetThreadAffinityMask(_thread, _oldMask);
oldOldCount = oldCount = count;
float _secondPerTick = (1.0f / (float)(frequency.QuadPart)) * 1000.0f;
frequency.QuadPart /= 60;
while(msg.message != WM_QUIT)
{
if( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
float tick = (oldCount.QuadPart - oldOldCount.QuadPart) * _secondPerTick;
float _updateAndRenderStart = g_GetApplication().GetRoot()->getWatch()->getElapsedMilliseconds();
pFnUpdateAndRender(tick);
float _updateAndRenderEnd = g_GetApplication().GetRoot()->getWatch()->getElapsedMilliseconds();
/*if(_updateAndRenderEnd - _updateAndRenderStart >= 30.0f)
{
char _updateAndRenderLog[CHAR_BUFFER_MAX] = {'\0'};
_snprintf(_updateAndRenderLog, CHAR_BUFFER_CONTENT_MAX, "_updateAndRenderEnd - _updateAndRenderStart = %f.", _updateAndRenderEnd - _updateAndRenderStart);
g_GetApplication().GetRoot()->getLogManager()->logMessage(_updateAndRenderLog);
}*/
if(_updateAndRenderEnd - _updateAndRenderStart > 17.0f)
{
HANDLE _thread = GetCurrentThread();
DWORD_PTR _oldMask = SetThreadAffinityMask(_thread, _mask);
QueryPerformanceCounter((PLARGE_INTEGER)&count);
SetThreadAffinityMask(_thread, _oldMask);
}
else
{
do
{
HANDLE _thread = GetCurrentThread();
DWORD_PTR _oldMask = SetThreadAffinityMask(_thread, _mask);
QueryPerformanceCounter((PLARGE_INTEGER)&count);
SetThreadAffinityMask(_thread, _oldMask);
} while (count.QuadPart - oldCount.QuadPart < frequency.QuadPart);
}
oldOldCount = oldCount;
oldCount = count;
}
}