2010-02-26 90 views
3

我有点写一个小游戏引擎 - 纯粹是为了理解这些内部工作是如何实现的。我目前不想混淆OpenGL或DirectX,所以我坚持使用GDI +和WinForms的所有东西进行控制。两次连续的KeyDown事件之间的延时延迟

显然,我需要处理输入。更具体地说,键盘事件。然而,这带来了一个问题:

protected override void OnKeyDown(KeyEventArgs e) 
{ 
    Trace.WriteLine(string.Format("KD {0:hh:MM:ss.fff} {1}", 
     DateTime.Now, e.KeyCode)); 
} 

此代码(即使在键盘小程序的控制面板中设置最短的重复延时)yeilds如下:

KD 10:02:18.318 Right 
KD 10:02:18.570 Right 
KD 10:02:18.598 Right 
KD 10:02:18.639 Right 
KD 10:02:18.667 Right 
KD 10:02:18.701 Right 

正如你所看到的,有0.25秒。前两个事件之间的延迟。这导致屏幕上的物体运动缓慢,显然:它首先稍微向右移动,然后暂停一个明显的时刻,然后继续。

我该如何解决该问题?这可以在纯WinForms中完成吗?或者我应该使用DirectInput(或者现在的其他什么是Kosher方式?)路由?

+0

这很恶心这个问题在Google搜索结果中出现的速度有多快。 – 2010-02-26 08:28:43

回答

3

使用Windows消息不是进行输入交互的最佳方式。
我对WinForms一无所知,但我假设在关键事件中使用消息。

我很多年前就使用过DirectInput(v7),而且速度非常快。
也许GetKeyboardStateGetAsyncKeyState在游戏循环中是很好的选择。

+0

哇!这是更快! – 2010-02-26 08:22:35

+0

@安顿,哪一个? GetKeyboardState或GetAsyncKeyState? – 2010-02-26 08:32:14

+0

'GetKeyboardState'结果足够快,所以我从来没有尝试'GetAsyncKeyState'。 – 2010-02-26 08:35:30