ゲームを正確に制御するfps


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;
		}
	}