1

私の最後の質問は答えられなかったので、別のアプローチを試みています。多くのテクスチャ (256x256 RGBA888) をオンザフライでメモリにロードし、必要に応じて破棄します。問題は、テクスチャを ES にアップロードするときにOpenGL40 ~ 80 ミリ秒かかることがありますが、それ以上かかることはめったにありません。この遅い時間はガベージコレクションの後であることがわかりました。問題は、これがスレッドをGCブロックする場合がありGL(FPS ドロップ)、テクスチャ ローダー スレッドをブロックする場合がある (OK) ことです。どういうわけかスレッドGCでの発生を許可しない良い方法はありますか?GL

System.gc()1、2、3...n のテクスチャがデコードされるたびにテクスチャ ローダー スレッドを呼び出してみましたが、これはスレッド上で効果的に削除されGC-ingましたが、GLスレッドが GC の終了を待たなければならないため、テクスチャの読み込みが大幅に遅くなりました。"n" を大きくすると読み込みが速くなりますがGCGLスレッド上では可能性が高くなり、アニメーションが途切れます。

別のスレッドでデコードされたビットマップをスレッドで削除する方法はありGC-ingますか? スレッドGL上のビットマップのデコード/割り当ては行わず、新しいテクスチャがロードされたときにのみ発生します。GLGC-ing

編集: アプリは Android 3.2 以降を対象としており、携帯電話も対象としています。これは、携帯電話 (HTC One S - 4.0.3) とタブレット (Nexus 7 - 4.1、Galaxy Tab 2 10.1 - 3.2 および 4.0、Acer Icona A200 - 4.0) で発生します。

4

2 に答える 2

2

ガベージ コレクションを完全に無効にすることはできません。侵入なしで Dalvik VM によって開始されます。

事前に割り当てられた配列を使用してソース テクスチャ データを格納するなど、テクスチャのカスタム ロードを使用することで、メモリの割り当てと解放を最小限に抑えることができます。どの画像でも同じサイズ (256x256x4 = 262144 バイト) です。

最終的には、OpenGL コードを JNI C/C++ コードに移動して、思い通りにメモリを管理できます。

于 2012-12-17T13:35:30.813 に答える
0

このビデオのおかげで、同じサイズのタイルと Android 3.0 以降を対象とした簡単な解決策があります。

BitmapOptions.inBitmapBitmapは、新しいタイルごとに1 つを再利用するため、もう GC を行う必要はありません。

于 2013-02-05T11:16:35.660 に答える