我正在将许多纹理加载到(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报告了奇怪的数字:3.2 - 160MiB 的 Galaxy tab 10.1 和系统显示 300MiB 可用,4.0.3 的 Acer Iconia Tab A200 报告的可用内存值与系统约 400MiB 相同。第二个问题是,在 Acer 上,即使分配大小小于 200MiB 的纹理,我也会出现内存不足错误(不是可以作为异常捕获的 OutOfMemoryError 的形式。然后它只是命中 SIGSEGV)。并非总是如此,但如果应用程序运行的时间足够长,以至于从缓存中删除了一些纹理并加载了新纹理,那么应用程序可能会崩溃。
所以我不能以非常健壮的方式设置缓存大小。那些随机的 OOM 崩溃仅与宏基有关。我的其他设备,如 Galaxy tab 10.1、Nexus 7 甚至 Galaxy note(5")我确实遇到了这些随机崩溃。我正确地删除了 Open GL 纹理。
宏碁在他们的 Android 中是否有一些限制,不仅限制了 VM 内存大小,还限制了本机堆分配?或者它是一个有问题的 Open GL 驱动程序?Acer 和 Galaxy 选项卡使用几乎相同的 Tegra 2 GPU。
如何稳健地设置缓存大小?我至少需要 100MiB。或者以任何其他方式将 100-200 MiB 的纹理稳健地分配到 Android Open GL 应用程序中?