« View 周りのメモリ使用量削減検討 | メイン | 吉里吉里Java/KAG3 のメモリ消費量 »

2012年04月06日

吉里吉里Java:: 遅延確保と明示的解放

    

使用メモリを少しでも節約できるように Android 版にいくつか機能を追加した。

一つは遅延確保で、実際にそのレイヤーが描画される時、もしくは画像が読み込まれた時まで、メモリを確保しない。
オリジナルでは、setImageSize 等されると、その時点でそのサイズ分のメモリが確保されるが、Android ではこの時にそのレイヤーでまだメモリ確保されていないのであれば、この時点ではまだメモリを確保しない。
また、描画時も未確保のレイヤーを確保済みのレイヤーに描画する場合、単一色で塗りつぶす処理を行い、メモリ確保は行わない。
一種のシェイプ、もしくはカラードポリゴンのように扱われる。
ただ、状況によってはメモリ確保されるケースもある。
逆に描画される側の場合は必要なので、その時点でメモリ確保される。
未確保のレイヤーの全体を fill した場合、未確保のままで色を指定できる。
つまり、未確保のレイヤーはサイズと色を持った矩形のように扱われる。

レイヤーに purgeImage というメソッドを追加して、保持している画像のメモリを明示的に解放する処理を追加した。
KAG3 にある freeimage は、レイヤーと画像サイズを 32x32 に縮小するが、ピクセルデータが完全に未使用になるわけではない。
32x32 であれば、4KB 程度なのであまり大きくはないが、なくせるのならなくせた方がいい。
また、purgeImage はピクセルデータは解放するが、画像サイズは維持する。
ただ、吉里吉里2 はCopy-On-Writeで画像を共有しているケースがあるので、共有されている場合はピクセルデータは解放しない(すると他で壊れる)。
と書いたが、purgeImage が呼ばれた時に明示的に共有解除してしまった方が良いかもしれないので検討する。

レイヤーを非表示にした時に、内部で purgeImage をコールして、非表示にしたレイヤーのピクセルデータを破棄してしまうようにしたが、これは好ましくない状況もあると思うので、オプションで切り替えられるようにしようと思っている。


互換性を気にしないのであれば、複数の形状のシェイプや画像のタイリング等を加えれば、使用可能な状況ではメモリ使用量を削減できるが、UI やメッセージレイヤーなど結構限定されるので、無理をしていびつな形で入れるのは避けることに。



投稿者 Takenori : 2012年04月06日 23:46




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