« Android で apk を作れる物をリリース | メイン | OpenGL ES 2.0 での実現性 »

2012年07月23日

吉里吉里Java:: アプリケーションヒープ外のメモリ確保

    

Android 3.0 未満だとどうしてもメモリ容量がネック。
アプリケーションヒープ外にメモリ確保する方法は 2つはあった。
1. MemoryFile を使うとシェアードメモリが確保されて、このメモリはアプリケーションヒープ外。
2. OpenGL ES のテクスチャメモリ。ネイティブヒープは増えるが、これはアプリケーションヒープ外に確保されているようで、上限を超えても確保し続けられる。

MemoryFile へのアクセス速度はBitmap.copyPixelsToBuffer/copyPixelsFromBuffer の倍程度なので、そこそこ速い。
画像をストレージから再読み込みするのと比べると22倍くらい速いのでキャッシュとしての速度は十分ある。
ローメモリー状態になったら自動的に消されるオプションもあるので、キャッシュなどの用途に使いやすい。
Bitmap.copyPixelsToBuffer/copyPixelsFromBuffer よりも高速なので、全部 Java で記述し CPU で描画するのなら、MemoryFile で画像を保持するのはありだが、全部この方法だとかなり遅くなってしまう。

ネイティブヒープが増えていたので View 周りのメモリ使用量削減検討 の時は気付かなかったけど、テクスチャはアプリケーションヒープ外に確保されている様子。
テクスチャメモリで上限超えられるのなら、ほとんど画像関係でメモリ食っているので OpenGL ES2.0 で全部書いてしまえば、メモリの問題は大きく改善する。
ただ、かなりの種類がある合成ルールをシェーダースクリプトに書き換えたり、そこそこ数があるトランジションを書き換えたり、ブラーやガンマ補正等、新たに作らなければならない処理が多い。
後、Android 2.2 以降の制約が付く。



投稿者 Takenori : 2012年07月23日 23:33




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