2014-03-13 3 views
3

2D 게임을 개발 중입니다. 예를 들어 대각선 문자 이동과 같은 다중 키 누르기/해제 감지가 동시에 필요합니다.동시 다중 키 누름 릴리스 지연

문제는 "동시"(내 반응과 아무런 관련이 없습니다. 매우 빠르게 누르거나 누르십시오) 메시지 사이의 여러 키 (두 개)를 눌러야 만 종종 단일 프레임 (16 비트의 VSync) 예를 들어, 50-100 밀리 초에 도달 할 수 있으므로 문자는 단일 방향으로 이동하고 대각선 방향으로 조금 지연된 후에 만 ​​(의도 된대로) 움직입니다.

그것은 WinAPI 메시지에 대한 정상인가요 아니면 하드웨어의 한계? 입력을 더 빠르게 감지 할 수 있습니까? 아니면 게임이 어떻게 처리합니까? 좀 도움이

유일한 해결책은 (예를 매 100 ms 동안) 정기 지연과 게임 로직에서 프로세스 입력이지만,이 희생은 매우 반응성을 제어 할 수 있습니다.

내가 WinAPI를 while 루프에서 WM_KEYDOWN/WM_KEYUP 메시지를 전달하고있다.

while (PeekMessage(&message, 0, 0, 0, PM_REMOVE)) 
    DispatchMessage(&message); 

는 또한 GetMessage 렌더링 스레드에서 별도의 입력을 파견했습니다.

지연 측정 테스트 프로젝트 : pastebin

실제 OpenGL 대각선 이동 테스트 프로젝트 : pastebin

+0

왜 'GetMessage()'대신'PeekMessage()'를 사용하고 있습니까? –

+0

메시지를 디스 패칭 할 때'PeekMessage'를 사용하고 블로킹이 아니기 때문에 동일한 루프에서 렌더링합니다. 메시지 루프를 분리하고 다른 스레드에서 렌더링 할 때 나는'GetMessage'를 사용합니다. – Demion

답변

1

직선 대답은 '예, 50 밀리 정도의 순서의 지연이 정상적인 Windows 메시지 큐를 통해 키 입력의 처리에 공통입니다. 나는 이러한 지연의 여러 출처가 있다고 생각한다.

먼저 키보드 자체에는 직렬 인터페이스가 있습니다. 역사적으로 이는 매우 느린 속도 였고 아마도 근본적인 55ms 클록에 묶여있었습니다. USB 키보드는 훨씬 더 빠르지 만 요점은 개별 키 프레스 또는 릴리스가 절대적으로 동시에 나타나는 경우에도 개별적으로 전송되고 처리된다는 것입니다. Windows 메시지의 처리에 이르는

윈도우 코드 경로가 길고 개입 메시지의 흐름은 높을 수있다. 동시 키를 처리 할 메시지가 많은 경우 다른 많은 메시지로 분리 될 수 있습니다. 메시지를 기다리는 대신 한 지점으로 이동하여이를 줄일 수 있습니다.

그래서 당신은 정말 원시 입력을 사용해야합니다

, 당신은 신속하게 사건을 처리하기 위해 필요 해요 당신은 여전히 ​​지연을 예상해야합니다. 내 생각에 당신은 매끄러운 행동을하기 위해 적어도 20ms의 조정에 대한 의견을 '디 바운스'해야 할 것입니다. 거기에 당신의 방식으로 당신을 도울 독서가 많이 있습니다.

1

나는 당신의 처리가 늦어지고 이유에 대한 귀하의 질문에 대답하지만, 빠른 입력을 얻기에 관하여 질문에 대한 수 없습니다, 대신 Raw Input을 사용해보세요. 그러면 키보드에서 직접 키 입력 이벤트를 보낼 수 있으므로 OS에서 키 입력을 수신, 해석 및 발송할 때까지 기다릴 필요가 없으므로 시간이 오래 걸릴 수 있습니다.

+0

Raw Input은 문제를 완전히 해결하지 못하고 메시지 및 원시 입력 접근법을 포함한 소스 코드로 질문을 업데이트했습니다. – Demion

+0

이것은'키보드가 자신에게 직접 키 스트로크 이벤트를 보내어 OS가 키 입력을 받고, 해석하고, 파견 할 때까지 기다릴 필요가 없다 .'는 원시 입력에 대한 정확한 설명이 아닙니다. 많은 OS 관련과 기다림이 없습니다. –