Длинная задержка между двумя последовательными событиями KeyDown - PullRequest
3 голосов
/ 26 февраля 2010

Я пишу небольшой игровой движок - просто чтобы понять, как они работают изнутри. В настоящее время я не хочу связываться с OpenGL или DirectX, поэтому я продолжаю рисовать элемент управления с помощью GDI + и всего такого, что связано с WinForms.

Очевидно, мне нужно обрабатывать ввод. Точнее, клавиатурные события. Это, однако, создает проблему:

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

Этот код (даже с самой короткой задержкой повторения, установленной в апплете «Клавиатура» на панели управления), дает следующее:

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 (или какой-либо кошерный путь в настоящее время?) Маршрут?

1 Ответ

3 голосов
/ 26 февраля 2010

Использование сообщений Windows - не лучший способ взаимодействия с вводом.
Я ничего не знаю о WinForms, но я предполагаю, что на ключевых событиях используются сообщения.

Я использовал DirectInput (v7) много лет назад, и это было действительно быстро.
Возможно, GetKeyboardState или GetAsyncKeyState в игровом цикле являются хорошими альтернативами.

...