1

私は4回の同時キー押下を使用するゲームに取り組んでいます。キーをすばやく押すとフレームレートが大幅に低下することを除いて、すべて正常に機能します(キーの1つだけをハンマーで叩くと、フレームレートを半分にすることができます)。

最初は、キーを押すとトリガーされるメソッドで多くのことが起こっていると思っていましたが、メソッドからコードを完全に削除すると、速度低下が発生します。

誰かがこれに遭遇したことがありますか?キーを押すと、キーを押したままになるため、フレームごとにメソッド呼び出しが繰り返し発生しますが、これは多くの用途でかなり標準的であり、これまでに遭遇したことはありません。

編集:説明。構造的には、ステージにKEY_DOWNリスナーとKEY_UPリスナーがアタッチされています。

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

次に、次のような5行を含む単一のswitchステートメントを含むメソッドを呼び出します。

case ONE: pressing1 = true; break;

ブールフラグのいずれかがtrueであるかどうかを確認し、文字の移動を処理するENTER_FRAMEイベントがあります。この計算は、キーが押されているかどうかに関係なく行われます(つまり、キーを離しても、重力は影響を及ぼします)。これは60fpsを簡単に保持します。

問題は文字通り、キーが押されたり離されたりした瞬間にあり、ほとんど感知できないほどのフレームドロップがあります。キーを繰り返し押すと、フレームドロップがどんどん悪化します。キーを押したままにすると、フレームレートが低下することはありません。ただし、キーを押したときの1秒のフレームドロップは別です。その後、ゲームは通常通り続行されます。キーを離すと、別の小さな問題が発生し、フレームレートが通常に戻ります。

編集2-フレームレートに何が起こっているのかを正確に確認できるように、フレームレートチェッカーを追加しました。興味深いことに、キーを非常に速く押しても、正確に30fpsより低くすることはできません。ここでFlashPlayerを使用する際に、何らかの制限がありますか?

4

2 に答える 2

1

コードはずっと正しかったことがわかりました。デバッグプレーヤーまたはスタンドアロンプ​​レーヤーで60FPSコンテンツを再生すると、イベント(マウスとキーボード)がフレームレートに影響します。同じコンテンツをブラウザで表示したり、AIRにエクスポートしたりすると、問題が完全に解消されます。コンテンツは、速度を落とすことなく60fpsで完全に実行されています。

これが誰かを助けることを願っています、私は私の髪を引き裂いていました!

于 2012-07-16T12:26:28.603 に答える
0

複数の異なるリスナーがありますか、それともキー押下を適切にルーティングする1つのリスナーがありますか?前者だと思います。解決策は後者に切り替えることです。

私が通常行うことは、キーの押下をリッスンし、キーボードイベントを他のより意味のあるイベントに変換する責任がある1つのオブジェクトを持っていることです。

例えば:

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;
      }
   }
}
于 2012-07-15T13:54:35.760 に答える