之前写了一个静态库,最近在使用时发现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型和“零值”比较的问题。