2012-05-21 1 views
0

내 간단한 pong 게임에서 GetAsyncKeyState()를 사용하여 사용자가 화살표 키를 눌렀는지 확인합니다. 나는이 기능을 특정 방식으로 사용해야한다고 온라인으로 읽었지 만 CPU가 너무 무거웠다는 것을 알았습니다 (CPU의 50 % 사용)! 그러나 다소 놀랍지 만, 주위를 놀고 난 후에 내가 sleep(1);을 추가하면 CPU 사용량이 0 %로 내려 갔고 모든 것이 잘 작동한다는 것을 알았습니다. 이 기능을 사용하거나 CPU 사용을 줄이는 좋은 방법이 있어야합니다.GetAsyncKeyState() 매우 CPU가 무거움? 올바르게 사용하고 있습니까?

도움이 필요하시면 큰 도움이됩니다.

내 코드 : 그것은 아니다

while(true) 
{ 
    for(i = 8; i < 191; ++i) 
    { 
     if(GetAsyncKeyState(i) == -32767) 
     { 
      if(i == VK_LEFT) 
       // do stuff 
      else if(i == VK_RIGHT) 
       // do stuff 
      else if(i == VK_UP) 
       // do stuff 
      else if(i == VK_DOWN) 
       // do stuff 
     } 
    } 
    Sleep(1); 
} 
+4

전체 키보드 상태를 계속 폴링하지 않고 윈도우 프로 시저에서'WM_KEYDOWN' /'WM_KEYUP' 메시지에 반응 할 수 있습니다. – xDD

+0

'Sleep '은 무한 루프에 대한 해결책입니다. 그것은 당신의 스레드가 당신이 얻을 수있는 모든 기회를 CPU를 먹이려고 시도보다는 일찍 시간을 포기 수 있습니다. 물론 키 스트로크를 다룰 때 창 메시지 루프가 항상 선호됩니다. – chris

+0

@chris 그것을 사용하면 좋은 코딩 연습이 될 수는 없지만? – Rhexis

답변

2

GetAsyncKeyState는 CPU-무거운; 가능한 한 빨리 모든 것을 호출하는 것입니다. 무한 루프에서 실행하면 i++은 CPU가 무겁다는 것과 동일합니다.

실제로 입력을 기다릴 때까지 기다리거나 (메시지를 기다리지 않고 일부 애니메이션을 업데이트하려고하기 때문에) 충분하지 않은 경우 일부 폴링 간격을 선택하여 무언가를 사용해야합니다 MsgWaitForMultipleObjects처럼 (또는 SetTimer과 함께 반복되는 타이머 메시지를 자주 작성하십시오.)

+1

아하 좋아요. 그래서 나는이 잘못된 길에 접근하고있다. 입력을 기다리는 대신 키를 누를 때 어떤 종류의 트리거 이벤트가 필요합니다. 귀하의 답변 주셔서 감사합니다! – Rhexis

+1

@you는 스레드가 지속적으로 CPU를 hogging하는 것을 의미하는 키 상태를 폴링합니다. 그것의 사건 몬 경우에, 그것은 CPU를 돼지가되지 않을 운전 한 중단 같이 더 많은 것이된다. –

1

메시지 메커니즘, 사용자 입력 또는 프로그램 실행을 차단하는 무언가없이 프로그램이 무한히 반복되는 모든 것은 기본적으로 프로그램이 사용 가능한 모든 CPU 리소스를 소모하게 만듭니다.

원래의 키보드 입력 처리 방식은 매우 비효율적이었습니다. Sleep을 사용하여 실행 흐름을 차단하면 해당 문제를 극복 할 수 있지만 정확성을 유지해야합니다. 사용자가 1ms 미만의 키를 누르는 경우 프로그램에서 무시할 수 있습니다.

프레스의 키를 계속 확인하는 데 GetAsyncKeyState을 사용하는 대신 SetWindowsHookEx을 사용하여 키보드 후크를 설정하고 키 입력을 직접 가로 채고 처리 할 수 ​​있습니다. Theseshould 도움.

다른 옵션은 DirectInput, 외부 입력 처리 라이브러리 또는 래퍼를 사용하는 것입니다.

관련 문제