我使用原始输入作为我的游戏的输入 API,并且我希望获取输入按下的时间戳。但我发现的所有内容都是毫秒精度的(GetMessageTime())。这对于我的应用程序来说还不够好,因为每个帧都在 9 毫秒内运行(VR 时间预算),我必须考虑 Speedrunner。这意味着如果我在单个帧内收到多个输入消息,我无法在一帧内及时准确地区分不同的输入消息。这对于基于输入的各种增量时间计算来说也是有问题的,尤其是在 VR 中,您需要准确的时间戳来预测未来的帧时序。那么有没有办法让每个输入消息在通过 rawinput 发生时至少获得微秒(如果可能的话为纳秒)精度。或者我是否必须通过其他一些 win32 api 或系统进行输入。
提前致谢!
这是我设置原始输入的方法
//do we want the input sink?
RAWINPUTDEVICE Rid[2];
//Mouse
Rid[0].usUsagePage = (USHORT) 0x01;
Rid[0].usUsage = (USHORT) 0x02;
Rid[0].dwFlags = RIDEV_INPUTSINK | RIDEV_DEVNOTIFY;
Rid[0].hwndTarget = WindowHandle;
//Keyboard
Rid[1].usUsagePage = (USHORT) 0x01;
Rid[1].usUsage = (USHORT) 0x06;
Rid[1].dwFlags = RIDEV_INPUTSINK | RIDEV_DEVNOTIFY | RIDEV_NOLEGACY;
Rid[1].hwndTarget = WindowHandle;
RegisterRawInputDevices( Rid, 2, sizeof( Rid[0] ) );
然后在我的消息循环中
while(bRunning)
{
MSG Message;
while( PeekMessage( &Message, 0, 0, 0, PM_REMOVE ) )
{
switch( Message.message )
{
case WM_INPUT:
{
LONG msTime = GetMessageTime();
//...do stuff with the time stamp and input
break;
}
default:
{
TranslateMessage( &Message );
DispatchMessage( &Message );
break;
}
}
}
}
time
MSG 结构(Win32 消息)的成员仅限于 DWORD
范围。
GetTickCount函数通常用于填充其值。
根据文档:
GetTickCount函数的分辨率受限于系统定时器的分辨率,通常在10毫秒到16毫秒的范围内。
您可以尝试在 WM_INPUT
处理代码中使用
QueryPerformanceCounter来添加额外的时间比较条件。