0

次の方法で、Android (3.0) で 2D (地形) マップの表現を作成する予定です。

  • MapCoordinate単なる「構造体」であり、int 型のパブリック属性 x,y で構成され、MapCoordinate を表すクラス
  • マップ内のポイントのデータにアクセスして変更するメソッドをカプセル化するクラスMapPoint(おそらく適切な名前ではありません) (1 つのマップ座標に対して)
  • Map1 つのインスタンス / Map (私のアプリには 1 つしかありません) を持ち、HashMap次のものを持つことで Map をカプセル化する class 。

    public class Map {
        HashMap<MapCoordinate, MapPoint> mapPoint = new HashMap<MapCoordinate, MapPoint>();
    }
    

したがって、私の質問は次のとおりです。Android で多くの (Java) オブジェクト インスタンスを使用することはパフォーマンスにとって重要ですか (私のアプリのターゲットはタブレット PC のみです)。もちろん、このマップはアプリケーション全体のほんの一部です。マップはかなり大きくなる可能性があります。

ご意見をいただきありがとうございます。

4

1 に答える 1

2

可能であれば、フライウェイトパターンの実装を試みることができます。公式ドキュメントでは、オブジェクトの作成を避けることを推奨しています。

オブジェクトの作成を避ける

オブジェクトの作成は決して無料ではありません。一時オブジェクト用のスレッドごとの割り当てプールを備えた世代別GCは、割り当てを安価にすることができますが、メモリの割り当ては、メモリを割り当てない場合よりも常にコストがかかります。

ユーザーインターフェイスループでオブジェクトを割り当てると、定期的なガベージコレクションが強制され、ユーザーエクスペリエンスに小さな「障害」が生じます。

したがって、必要のないオブジェクトインスタンスの作成は避ける必要があります。役立つもののいくつかの例:

  • 入力データのセットから文字列を抽出するときは、コピーを作成するのではなく、元のデータのサブ文字列を返すようにしてください。新しいStringオブジェクトを作成しますが、char[]をデータと共有します。
  • 文字列を返すメソッドがあり、その結果が常にStringBufferに追加されることがわかっている場合は、短期間の一時オブジェクトを作成するのではなく、関数が直接追加するように署名と実装を変更します。

もう少し急進的なアイデアは、多次元配列を並列の単一の1次元配列にスライスすることです。

  • intの配列は、Integerの配列よりもはるかに優れていますが、これは、intの2つの並列配列も(int、int)オブジェクトの配列よりもはるかに効率的であるという事実にも一般化されます。プリミティブ型の任意の組み合わせについても同じことが言えます。
  • (Foo、Bar)オブジェクトのタプルを格納するコンテナーを実装する必要がある場合は、2つの並列Foo[]およびBar[]配列が、カスタム(Foo、Bar)オブジェクトの単一配列よりも一般的にはるかに優れていることを覚えておいてください。(もちろん、これの例外は、他のコードがアクセスできるようにAPIを設計している場合です。そのような場合は、通常、正しいAPI設計と交換して、速度を少し落とす方がよいでしょう。ただし、独自の内部コードでは、可能な限り効率的になるように努める必要があります。)

一般的に、可能であれば、短期間の一時オブジェクトの作成は避けてください。作成されるオブジェクトが少ないということは、ガベージコレクションの頻度が少ないことを意味し、ユーザーエクスペリエンスに直接影響します。

于 2011-02-15T20:16:06.550 に答える