Winapi 同时多键新闻发布延迟

Winapi 同时多键新闻发布延迟,winapi,input,Winapi,Input,我正在开发2D游戏,面临着同时需要多个键按下/释放检测的问题,例如,角色对角移动 问题是,当我“同时”(与我的反应无关,我快速按下/释放)按下/释放多(两)个键时,消息之间的延迟通常比单帧(16ms,带VSync)要大得多,例如,它可以达到50-100毫秒,所以角色开始向一个方向移动,只是在稍微延迟对角线后(如预期的那样) WinAPI消息是正常的还是硬件限制?是否有可能更快地检测输入,或者游戏如何处理输入 唯一有帮助的解决方案是以周期性延迟(例如每100毫秒)处理游戏逻辑中的输入,但这会极大地

我正在开发2D游戏,面临着同时需要多个键按下/释放检测的问题,例如,角色对角移动

问题是,当我“同时”(与我的反应无关,我快速按下/释放)按下/释放多(两)个键时,消息之间的延迟通常比单帧(16ms,带
VSync
)要大得多,例如,它可以达到50-100毫秒,所以角色开始向一个方向移动,只是在稍微延迟对角线后(如预期的那样)

WinAPI
消息是正常的还是硬件限制?是否有可能更快地检测输入,或者游戏如何处理输入

唯一有帮助的解决方案是以周期性延迟(例如每100毫秒)处理游戏逻辑中的输入,但这会极大地牺牲控制响应能力

我正在while循环中发送WinAPI
WM\u KEYDOWN
/
WM\u keydup
消息

while (PeekMessage(&message, 0, 0, 0, PM_REMOVE))
  DispatchMessage(&message);
我还尝试使用
GetMessage
以与渲染线程分离的方式发送输入

延迟测量测试项目:


实际
OpenGL
对角线运动测试项目:

我无法回答您关于为什么处理延迟的问题,但是关于您关于获得更快输入的问题,请尝试使用。这将允许键盘直接向您发送自己的击键事件,这样您就不必等待操作系统接收、解释和向您发送击键,这需要更多的时间。

直接的答案是肯定的,在通过正常的Windows消息队列处理按键时,通常会出现大约50毫秒的延迟。我认为这些延误有多种原因

首先,键盘本身有一个串行接口。从历史上看,这是非常缓慢的,可能与底层的55毫秒时钟有关。USB键盘可能会快得多,但关键是每次按键或释放都会被单独发送和处理,即使它们看起来是完全同步的

导致处理Windows消息的Windows代码路径很长,并且中间消息的流量可能很高。如果有许多消息要处理,您的同步密钥释放可能会被许多其他消息分隔开。在某种程度上,你可以通过偷看消息而不是等待消息来减少这种情况


因此,您必须使用原始输入,您需要快速处理事件,并且仍然需要预测延迟。我的猜测是,您需要将输入“去抖动”到至少20毫秒的音调,以获得平滑的行为。有很多阅读可以帮助您前进。

为什么您使用
peek消息()
而不是
GetMessage()
?我在发送消息并在同一循环中渲染时使用
peek消息,因为它是非阻塞的。当我分离消息循环并在不同线程中渲染时,我使用
GetMessage
。原始输入并不能完全解决问题,使用源代码更新了问题,包括消息和原始输入方法。这
将允许键盘直接向您发送自己的击键事件,因此您不必等待操作系统接收,解释并向您发送击键
不是对原始输入的准确描述。操作系统大量参与,无需等待。