12

ゲームで Java + AndEngine を使用しています。

ゲーム中にフリーズが発生したため、情報を探したところ、ゲームのパフォーマンスを最適化するためのいくつかの手順が見つかりました。

  1. ゲームのメイン アクションで GC (ガベージ コレクター) が呼び出され
    ないようにします。a) ゲーム中にオブジェクトを作成しない。
    b) 不要なオブジェクトを作成しないでください。
  2. 非常に頻繁に繰り返されるコードを最適化する

私はこれらの手順に従いましたが、ゲームプレイ中にフリーズすることがあります。

今、ゲームが始まる前にすべてのテクスチャを作成してロードしていて、それらをアンロードしていません。それは悪い考えですか? ゲームプロセスを最適化するにはどうすればよいですか? たぶん、メインアクティビティの前に可能なすべてのメモリを解放し、各レベルの後にそれらをリロードする必要がありますか?

4

6 に答える 6

17
  1. テクスチャのサイズを小さくします。
  2. テクスチャの切り替えを減らします (スプライト シートを使用して、テクスチャをできるだけ変更する必要がないようにします)。
  3. 低品質のテクスチャを使用します (RGBA8888 の代わりに RGBA4444 または RGB565)。
  4. エンティティが更新を必要としない場所で setIgnoreUpdate を呼び出します。
  5. 可能であれば SpriteBatches を使用してください

参考までに: AndEngine の次のバージョン (12 月中旬にリリース予定) では GLES2 がサポートされるため、カスタム シェーダーとエンティティを使用してパフォーマンスを向上させる可能性がさらに広がります。

また、UI スレッドで (onCreate で直接) ブロックする代わりに、GL スレッドの最初のフレームでスタートアップ パイプライン (onLoadEngine/onLoadResources/onLoadScene/onLoadComplete) を実行します。

また、パイプライン全体を壊すことなく、パイプラインのステージをスレッドに簡単にオフロードできます。パイプラインのステージが実行されている間、決定的な ProgressDialog を表示する BaseGameActivity のサブクラスを実装するのは非常に簡単です。エンティティがシーンにアタッチされると、エンティティがポップアップします。

一般に、これは実際のロード時間が短縮されることを意味し、さらに重要なことに、フェルトのロード時間が大幅に短縮されます! ローディング画面の作成は、以前の苦労とは対照的に、非常に簡単です。

于 2011-12-06T03:22:57.390 に答える
12

AndEngine を使用して パフォーマンスを向上させることができます: オブジェクト プールの使用http://c0deattack.wordpress.com/2011/01/06/andengine-using-the-object-pool/

于 2011-06-20T14:08:42.677 に答える
7

ゲームに関するより具体的な情報を投稿する必要があるかもしれませんが、1 つの提案は、スプライトとオブジェクトを再利用していることを確認することです。たとえば、ゲームに繰り返し生成されるオブジェクト (ランダムに飛んでいる敵、弾丸、繰り返される背景要素) がある場合、一度に画面上で必要となるそのオブジェクトの最大量を考えてから、その数だけ作成してみてください。ゲームプレイが始まる前に、必要に応じてそれらをロードおよびリセットします。

たとえば、私のゲームでは、画面の上部から「ランダムに」飛んでくる敵を使用しています。最初は、呼び出しごとに新しい敵を作成していましたが、今では合計で 6 つの敵のみを含む ArrayList があり、それぞれ何百回も再利用および移動されます。これにより、特に長時間のゲームセッションで、パフォーマンスが大幅に向上しました。これは GC の最適化に関連していますが、以前の最適化については知らなかったかもしれません。

于 2011-06-16T13:11:13.997 に答える
5

プリエンプティブな最適化を行う前に、まずコードをプロファイリングすることの重要性は、いくら強調してもしすぎることはありません。GPU にバインドされている場合、すべてのスプライトなどを最適化することはほとんど意味がありません (これはありそうにありませんが、GLES2.0 とプログラム可能なパイプラインを使用しており、GLSL コードをどのように記述したかがわからないため、可能です。 )。

プロファイリングする対象はさまざまであるため、プロファイリングに使用できるツールがいくつかあります。

メモリ プロファイリングでは、DDMS と traceview を使用して、メモリの割り当てと、特定の期間に GC が呼び出される頻度を確認できます。このSOの質問には詳細があります:

Android アプリをプロファイリングするにはどうすればよいですか?

頻繁に実行されるコードに関しては、いつでも自分で時間を計って、結果をログ ファイルに書き出すことができます。少し手間がかかりますが、自分のコードのどこが遅くなる可能性があるかはすでにわかっているはずです。

于 2012-09-10T14:15:35.157 に答える
4

私が使用しているアプローチは、レベルが開始する前に必要なすべてのテクスチャをロードすることです。次のレベルに進むときは、次のレベルで必要のないオブジェクトのテクスチャのみをアンロードする必要があります。スコアボードやメインの背景など、その他のものはロードしないでください。もちろん、アクティビティの onStop ですべてのテクスチャをアンロードする必要があります。最初にループ コードを最適化する必要があることは事実です。たとえば、ループ中にリソースにアクセスしてはならず、ループを開始する前にすべてのリソースを取得してみてください。

于 2011-05-28T17:04:10.157 に答える
0

これにより、ゲームのパフォーマンスが確実に向上します。デフォルトのテーマが常にレンダリングされないようにします。ここにチュートリアルがありますhttp://www.andengine.org/forums/tutorials/andengine-performance-tip-of-the-day-t810.html

于 2014-05-23T20:51:22.617 に答える