我正在开发2D游戏,并且遇到需要同时进行多键按压/释放检测的问题,例如,用于角色对角线移动。
问题是当我“同时”(它与我的反应无关,我很快按下/释放)按下/释放多个(两个)键之间的消息延迟通常远远超过单帧(16ms {{1例如,它可以达到50-100毫秒,因此角色开始向单一方向移动,并且只在稍微延迟对角线之后(如预期的那样)。
VSync
消息是正常的还是硬件限制?是否有可能更快地检测输入或游戏如何处理它?</ p>
只有有点帮助的解决方案是在游戏逻辑中处理输入并定期延迟(例如每100毫秒),但这会极大地牺牲控制响应能力。
我在while循环中发送WinAPI WinAPI
/ WM_KEYDOWN
消息。
WM_KEYUP
我还尝试使用while (PeekMessage(&message, 0, 0, 0, PM_REMOVE))
DispatchMessage(&message);
从渲染线程单独调度输入。
延迟测量测试项目:pastebin
实际GetMessage
对角移动测试项目:pastebin
答案 0 :(得分:1)
我无法解答您的处理延迟原因的问题,但关于加快输入速度的问题,请尝试使用Raw Input。这将允许键盘直接向您发送自己的击键事件,因此您不必等待操作系统接收,解释和发送击键给您,这需要更多的时间。
答案 1 :(得分:1)
直接回答是肯定的,在通过正常的Windows消息队列处理按键时,大约50毫秒左右的延迟很常见。我相信这些延误有多种来源。
首先,键盘本身有一个串行接口。从历史上看,这非常缓慢,可能与底层的55ms时钟有关。 USB键盘的速度可能要快得多,但重点是每个按键或释放按键都会被单独发送和处理,即使它们看起来绝对是同步的。
导致Windows消息处理的Windows代码路径很长,介入消息的流量很高。如果要处理的消息很多,则同时发布的密钥可能会被许多其他消息分开。你可以通过窥视消息而不是等待消息来减少这种情况。
所以你真的必须使用Raw Input,你需要快速处理事件,你仍然需要预测延迟。我的猜测是你需要去辩解&#39;您输入至少20ms的曲调以获得平滑的行为。那里有很多阅读材料可以帮助你。