[DirectX]timeGetTime精度问题

       之前写了一个静态库,最近在使用时发现IDirectInputDevice8的数据有问题,情况是按下按键偶尔没有反应。调试一天,没找到问题,代码从头到尾也看了好几遍,还是没有发现问题,就暂时放下了。刚好在加FPS代码的时候,偶然发现这个问题所在。

先上错误代码:

void CSystem::Run()
{
	MSG msg;
	bool done, result;

	memset(&msg, 0, sizeof(MSG));

	done = false;

	lastTime = (float)timeGetTime();

	while (!done)
	{
		if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

		if (WM_QUIT == msg.message)
			done = true;
		else
		{
			float currentTime = (float)timeGetTime();
			float timeDelta = (currentTime - lastTime) * 0.001f;

			lastTime = currentTime;

			if (timeDelta > 0)
			{
				result = Frame(timeDelta);
				if (!result)
					done = true;
				if (CInput::CInputIsKeyDown(DIK_ESCAPE))
				{
					if (CheckIsWantToQuit())
						done = true;
				}
			}
		}
	}
}

       一眼看上去好像是没什么问题,但在显示帧数的时候,发现计算出来的结果是3.9帧,想起来float型和“零值”比较的问题。因为timeGetTime精度精度为毫秒级,所以稍微改下。

void CSystem::Run()
{
	MSG msg;
	bool done, result;

	memset(&msg, 0, sizeof(MSG));

	done = false;

	lastTime = (float)timeGetTime();

	while (!done)
	{
		if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

		if (WM_QUIT == msg.message)
			done = true;
		else
		{
			float currentTime = (float)timeGetTime();
			float timeDelta = (currentTime - lastTime) * 0.001f;

			if (currentTime >= lastTime)
			{
				result = Frame(timeDelta);
				if (!result)
					done = true;
				if (CInput::CInputIsKeyDown(DIK_ESCAPE) && CheckIsWantToQuit())
				{
						done = true;
				}
			}

			lastTime = currentTime;
		}
	}
}

       帧数显示1000多帧,表示问题解决了。然后突然发现IDirectInputDevice8的问题也顺带解决了。这种Bug实在是不好找,记录一下,提醒自己float型和“零值”比较的问题。

猜你喜欢

转载自blog.csdn.net/zp288105109a/article/details/82973166
今日推荐