2012-07-15 5 views
1

4 개의 동시 키를 사용하는 게임을하고 있습니다. 키가 빠르게 눌려지면 프레임 속도가 크게 느려지는 것을 제외하고는 모두 잘 작동합니다 (키 중 하나만 망치면 프레임 속도를 절반으로 줄일 수 있습니다).키보드 수신기가 내 프레임을 죽이고 있습니다

처음에는 키 누르기가 트리거하는 메서드에 너무 많은 작업이 있다고 가정했지만 메서드에서 코드를 완전히 제거하면 여전히 속도가 저하됩니다.

이전에이 문제를 겪은 사람이 있습니까? keypress는 키를 누르고있는 곳이기 때문에 매 프레임마다 메서드 호출을 반복적으로 실행합니다. 그러나 이것은 많은 용도로 사용하기에 꽤 표준 적이며 이전에는 한번도 경험하지 못했습니다.

편집 : 설명.

case ONE: pressing1 = true; break; 

는 ENTER_FRAME있다 : 다음과 같은 다섯 줄이 들어있는 하나의 스위치 문이있는 메소드를 호출

stage.addEventListener(KeyboardEvent.KEY_DOWN, menuKeyDown); 
stage.addEventListener(KeyboardEvent.KEY_UP, menuKeyUp); 

: 은 구조적으로, 무대에 부착 된 KEY_DOWN 및 KEY_UP 리스너있다 부울 플래그 중 하나라도 true인지 확인하고 문자 이동을 처리하는 이벤트입니다. 이 계산은 키 누름에 관계없이 수행됩니다 (즉, 키를 놓아도 중력은 여전히 ​​효과가 있음). 이것은 60fps를 쉽게 유지합니다.

문자 그대로 키를 눌렀다 놓은 바로 그 순간에 거의 눈에 띄지 않는 프레임 드롭이 있습니다. 반복적으로 키를 누르면 프레임 드롭이 더 나 빠지게됩니다. 키를 누른 채로 두 번째 프레임이 떨어지는 경우를 제외하고 키를 누르고 있으면 프레임 속도가 종료되지 않습니다. 그 후 게임은 정상적으로 진행됩니다. 열쇠를 놓아두면 작은 장애가 생기고 프레임 속도는 정상으로 돌아갑니다.

EDIT 2 - 프레임 율 검사기를 추가하여 프레임 속도에 정확히 무엇이 발생했는지 확인할 수있었습니다. 흥미롭게도, 내가 키를 매우 빠르게 눌러도 정확히 30fps보다 낮게 만들 수는 없습니다. Flash Player와 관련하여 여기에 제한 사항이 있습니까?

+0

코드의 일부를 표시하지 않는 한 실제로 어떤 일이 일어나는지 알 수있는 방법이 없습니다. 리스너를 추가하는 위치와 트리거되었을 때 수행 할 작업입니다. – weltraumpirat

+0

내 질문을 명확히하겠습니다. –

+0

키 스트로크 당 두 건의 함수 호출이 될 것입니다 ... 나는 그 모든 것을 다 커버한다고 생각하지 않습니까?"매 프레임마다 메서드 호출 발생"은 어떻습니까? – weltraumpirat

답변

1

코드가 모두 함께 정확하다고 밝혀졌습니다. 디버그 플레이어 또는 독립 실행 형 플레이어에서 60FPS 콘텐츠를 재생하면 모든 이벤트 (마우스 및 키보드)가 프레임 속도를 걸리게됩니다. 브라우저에서 동일한 내용을 보거나 AIR로 내 보낸 경우 문제가 완전히 중지됩니다. 콘텐츠는 이제 속도 저하없이 60fps에서 완벽하게 실행됩니다.

희망이 사람을 돕고, 나는 내 머리카락을 찢어 버리고있었습니다!

0

키 누르기를 적절하게 라우팅하는 여러 청취자 또는 청취자가 있습니까? 나는 그 사람을 의심 할 것이다. 해결책은 후자로 전환하는 것입니다.

내가 일반적으로하는 일은 키 누름을 듣고 키보드 이벤트를 다른 의미있는 이벤트로 변환하는 것을 담당하는 하나의 개체를 갖는 것입니다. 예를 들어

:

protected function handleKeyboardEvent(e:KeyboardEvent):void { 
    if (e.ctrlKey) { 
     switch (e.keyCode) { 
     case Keyboard.A: 
      eventBus.dispatchEvent(new Event(ViewEventKind.SELECT_ALL)); 
      return; 
     case Keyboard.Y: 
      eventBus.dispatchEvent(new Event(ModelEventKind.REDO)); 
      return; 
     case Keyboard.Z: 
      eventBus.dispatchEvent(new Event(ModelEventKind.UNDO)); 
      return; 
     } 
    } 
} 
+0

이것은 하나의 키보드 청취자이며, 단지 초보적인 문자 이동 코드를 가지고 있습니다. 코드를 가져 와서 키 리스너가 빈 메소드를 호출하게해도 문제는 같습니다. –

관련 문제