2010-02-26 4 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 way nowadays?)?

+0

Это не так, как быстро этот вопрос возник в результатах поиска Google. –

ответ

3

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

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

+0

Whoa! Это быстрее! –

+0

@ Антон, какой? GetKeyboardState или GetAsyncKeyState? –

+0

'GetKeyboardState' оказался достаточно быстрым, поэтому я никогда не пробовал« GetAsyncKeyState ». –

Смежные вопросы