为原始输入获取比毫秒更高精度的 win32 时间戳

问题描述 投票:0回答:1

我使用原始输入作为我的游戏的输入 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;
            }
        }
    }
}
winapi visual-c++ raw-input
1个回答
0
投票

time
MSG 结构(Win32 消息)的成员仅限于
DWORD
范围。

GetTickCount函数通常用于填充其值。

根据文档:

GetTickCount函数的分辨率受限于系统定时器的分辨率,通常在10毫秒到16毫秒的范围内。

您可以尝试在 WM_INPUT 处理代码中使用

QueryPerformanceCounter
来添加额外的时间比较条件。

© www.soinside.com 2019 - 2024. All rights reserved.