多くのテクスチャを(Open GL)アプリ(メモリ内で非圧縮の数百メガバイト)にロードしているので、LRUキャッシュを使用し、必要に応じてそれらを破棄します。Androidでは、Open GLテクスチャがネイティブヒープに割り当てられているため、使用可能なすべてのメモリを使用できます。
問題はそれです...
ActivityManager activityManager = (ActivityManager)VhbApplication.getInstance().getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
memoryInfo.availMem
availMemは、一部のデバイスで奇妙な数値を報告します。Galaxyタブ10.1(3.2〜160MiB)およびシステムは300MiBの空き容量を示し、Acer Iconia Tab A200(4.0.3)は、システムの〜400MiBと同じ空きメモリ値を報告します。2番目の問題は、そのAcerで、200MiB未満のサイズのテクスチャを割り当てた場合でも、メモリ不足エラー(例外としてキャッチできるOutOfMemoryErrorの形式ではなく、SIGSEGVにヒットするだけ)が発生することです。常にではありませんが、アプリが十分に長く実行され、一部のテクスチャがキャッシュから削除され、新しいテクスチャが読み込まれると、アプリがクラッシュする可能性があります。
そのため、非常に堅牢な方法でキャッシュサイズを設定することはできません。これらのランダムなOOMクラッシュは、Acerでのみ発生します。Galaxy tab 10.1、Nexus 7、Galaxy note(5 ")などの他のデバイスでも、これらのランダムなクラッシュが発生します。OpenGLテクスチャを適切に削除します。
AcerがAndroidに設定した、VMメモリサイズだけでなくネイティブヒープ割り当ても制限する制限はありますか?それとも、バグのあるOpen GLドライバーですか?そのAceraGalaxyタブは、ほぼ同じTegra2GPUを使用しています。
キャッシュサイズを確実に設定するにはどうすればよいですか?そして私は少なくとも100MiBが必要です。または、Android Open GLアプリケーションに100〜200 MiBのテクスチャを堅牢に割り当てる他の方法はありますか?