2012-07-15 56 views
1

我正在使用四個同時按鍵的遊戲。它一切正常,除了當按鍵被快速按下時,我的幀速率顯着減慢(如果我甚至只敲一個鍵,我可以減半)。鍵盤監聽器正在殺死我的幀速率

我最初只是假設在按鍵觸發器的方法中發生了太多的事情,但如果我完全將方法從代碼中取出,減速仍然會發生。

有沒有人遇到過這個?按鍵就是您按下按鍵的按鍵,因此它會每隔一幀重複發出一次方法調用,但這對於許多用途來說是非常標準的,而我以前從未遇到過這種情況。

編輯:澄清。 在結構上,有連接到舞臺上的KEY_DOWN和KEY_UP聽衆:

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

,然後調用在單個switch語句中,包含五行這樣的方法:

case ONE: pressing1 = true; break; 

有一個ENTER_FRAME事件,檢查是否有任何布爾標誌爲真,並處理字符移動。無論按下哪個按鍵,這個計算都會發生(即如果你放開按鍵,重力仍然有效)。這容易保持60fps。

這個問題實際上是在按下或釋放按鍵的確切時刻,有一個幾乎察覺不到的框架下降。反覆按鍵會導致framedrop變得越來越糟。按下按鍵不會消除幀率,除了按下按鍵時的單個分割秒幀丟棄之外。之後,比賽繼續進行。放棄關鍵會導致另一個小小的障礙,然後幀速率恢復正常。

編輯2 - 我添加了一個幀速率檢查器,以便我可以準確地看到幀速率發生了什麼。有趣的是,即使按下按鍵的速度非常快,我也無法使它低於30fps。在Flash Player中播放有什麼限制嗎?

+0

除非您向我們展示您的一些代碼,否則無法真正瞭解發生了什麼事情:添加偵聽器的位置以及觸發時的操作。 – weltraumpirat 2012-07-15 11:23:41

+0

我會澄清我的問題,堅持 – 2012-07-15 14:21:43

+0

因此,這將是每個關鍵擊中兩個函數調用...我不認爲這覆蓋了所有,或者它呢?怎麼樣「每個幀觸發一個方法調用」? – weltraumpirat 2012-07-15 14:24:53

回答

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

這是一個單獨的鍵盤監聽器,它調用的方法只有一些基本的字符移動代碼。即使我將代碼拿出並讓鍵監聽器調用一個空方法,問題也是一樣的。 – 2012-07-15 14:18:53