精确控制游戏的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;
		}
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值