Androidゲーム開発でのコレクションの使用は推奨されていませんか?


10

Androidのゲームプロジェクトに取り組んでいるときに、ゲームコードのパフォーマンス最適化に関する情報を探していました。そして、ListやArraylistなどのJava コレクションの使用はゲームコードでは推奨されていないことを知りましたが、コレクションはJavaプログラミングの便利なツールです。コレクションフレームワークがAndroidシステムに与える影響とその理由について、技術的な詳細を教えてください。この点でどんな助けでも素晴らしいでしょう。


どこで読んだの?
egarcia

おそらくここ:developer.android.com/guide/practices/design/performance.html 言い方に注意してください。要約すると、デフォルトで拡張されたforループを使用しますが、パフォーマンスが重要なArrayListの反復には手書きのカウントループを考慮してください。
Nailer

回答:


8

それは主にメモリの割り当てとガベージコレクションに関するものです。実行時のメモリ割り当てにより、ガベージコレクターはゴミ箱を引き出すことができます。これはパフォーマンスに悪影響を及ぼします。GCは可能な限り発生しません。

ほとんどのJavaコレクション:

A)必要以上のメモリを割り当てます。

B)必要のないときにメモリを割り当てます。

C)コレクションを反復するときに、各反復子にメモリを割り当てます。

これらを回避するには:

A)固定サイズのコレクションを割り当てます。すなわち。オブジェクトプールを作成します。

B)プログラムの初期化時にこれらのプールを割り当てます。

C) size()および.get(int index)メソッドを持つコレクション型のfor(Object obj:collection)を避けます。


2
すべての有効なポイントですが、覚えておいてください:「小さな効率は忘れてください。たとえば、97%の時間です。時期尚早な最適化がすべての悪の根源です」。このような最適化は、本当に必要な場所に限定する必要があります。他のすべての場所では、明確でシンプルなデザインを求めて争います。
Michael Klement

@Michael:高速のキャッシュと低速のメモリ、および複数のコアを備えた今日のシステムでは、メモリ割り当ては、実行できる最も高価なものです。

2
@Michael:メモリ割り当てパターンを最適化するために可能な限り機能していない高性能商用ゲームエンジンを見つけるのは難しいでしょう。ここでは、リアルタイムAndroidゲームのテーマについての長い話をします。それは少し古いですが、それのほとんどは、まだ適用されなければならない:youtube.com/watch?v=U4Bk5rmIpic
ネイラー

もちろん、誤解しないでください。あなたの答えに反対したくありませんでした。私はあなたが賢明かつ適切な場所で最適化する必要があることを指摘したかっただけです。パフォーマンスへの影響が最小限の場所(たとえば1%)で、コレクションよりも配列を使用してもメリットはありません。(こちらでも詳しく説明しています:developer.android.com/guide/practices/design/…
Michael Klement

3
@AttackingHobo:同意しない。盲目的に最適化することは有益ではありません。それは私にとってあなたの発言のように聞こえます(私が間違っていた場合は訂正してください)。Chris Pruettはまた、上記のGoogle IOビデオで次のように述べています。「毎週、スピードよりも柔軟性を選択してください...ゲームプレイが破損するまで」そして私はこれに同意します。
Michael Klement
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.