« 解像度まとめ | メイン | 任意の画像を読み込めるようにする(ロード時の画像縮小) »

2011年02月03日

Android:: GC 対策

    

アプリなら時々 GC が走ってカクついても大して気にしなくてもいいと思うが、ゲームだと気になる。
そこで幾つかそのことに対する対策を。

余計なGCの発生を抑止

import dalvik.system.VMRuntime;
...
private static final long INITIAL_HEAP_SIZE = 4*1024*1024;
...
long oldHeapSize = VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE);

setMinimumHeapSize の説明を見ると――
最小ヒープサイズを設定し、以前の最小サイズを返す。
もし、指定の最小サイズが最大サイズよりも大きい場合は、最大サイズが使用される。
サイズが 0 かマイナスの時、最小サイズ制限を抑止する。
Synchronized to make the order of the exchange reliable.(変更の順序は保障される? どう訳すの?)
この設定は GC へヒントを与えるだけであり、無視されるかもしれない。
――と書かれている。
組み込みアプリのソース中で余計なGCの発生を抑止するために、上記のサンプルソースのように記述されている箇所があるので、ある程度は効果が期待出来るのではないかと思われる。
ただ、実際に振る舞いの検証等は行っていない。


オブジェクトプール
何度も new せず、出来るだけオブジェクトを使い回す。
不要になったオブジェクトをリスト等に入れておき再利用する(オブジェクトプール)。
等して、ゴミがたまるのを出来るだけ避ける。


GC を明示的に呼び出す
暗転時などある程度処理が止まっても差し支えないタイミングで java.lang.System.gc(); を明示的に呼び出して GC を実行し、不用意なタイミングで GC が呼び出されることを出来るだけ避ける。



投稿者 Takenori : 2011年02月03日 22:01



コメント

期待した交換の順序となるようにするために同期した
ですね。前後の文を読まずに直訳しました。

投稿者 パスカル : 2011年02月04日 18:15

パスカル さん

訳ありがとうございます。
ただ、やはりちょっと意味がよくわからないですね……
前後を含んだ原文は以下です。

Sets the desired minimum heap size, and returns the old minimum size. If size is larger than the maximum size, the maximum size will be used. If size is zero or negative, the minimum size constraint will be removed.

Synchronized to make the order of the exchange reliable.

This is only a hint to the garbage collector and may be ignored.

投稿者 Takenori : 2011年02月05日 00:09

なるほど。同期は調整と訳せそうですね。
恐らく与えられた値そのままではなく、
適当に2の二乗だとか4の倍数だとかの
都合の良い値に丸めたりして
利用するということでは。

投稿者 パスカル : 2011年02月05日 00:28

パスカル さん

なるほど。
それだと意味がわかります。
ありがとうございます。

投稿者 Takenori : 2011年02月05日 00:30


comments powered by Disqus
Total : Today : Yesterday : なかのひと