【发布时间】:2012-07-01 19:17:03
【问题描述】:
我正在编写一个使用多个 3D 模型的 Android 应用程序。这种带有纹理的模型会占用大量内存。我发现制造商对应用程序可以使用的堆大小设置了限制。例如我的平板三星 Galaxy Tab 8.9 P7310 可以占用 64MB 内存。
有没有办法增加应用程序可以使用的内存大小?
【问题讨论】:
标签: android
我正在编写一个使用多个 3D 模型的 Android 应用程序。这种带有纹理的模型会占用大量内存。我发现制造商对应用程序可以使用的堆大小设置了限制。例如我的平板三星 Galaxy Tab 8.9 P7310 可以占用 64MB 内存。
有没有办法增加应用程序可以使用的内存大小?
【问题讨论】:
标签: android
您可以使用 android:largeHeap="true" 请求更大的堆大小,但这不适用于任何预 Honeycomb 设备。在 2.3 之前的设备上,您可以使用 VMRuntime 类,但这不适用于 Gingerbread 及更高版本。
获得尽可能大的限制的唯一方法是通过 NDK 执行内存密集型任务,因为 NDK 不像 SDK 那样施加内存限制。
或者,您可以仅加载当前视图中的模型部分,并根据需要加载其余部分,同时从内存中删除未使用的部分。但是,这可能是不可能的,具体取决于您的应用。
【讨论】:
largeHeap=true FTW
Il2CPP in PlayerSettings link 所以我认为如果我们想做任何需要良好性能的繁重事情,那么我们可以通过 Unity 构建,导出到模块并将该模块导入 Android
有没有办法增加应用程序可以使用的内存大小?
在 API 级别 11+ 上运行的应用程序可以在清单中的 <application> 元素上使用 android:largeHeap="true" 来请求比正常更大的堆大小,ActivityManager 上的 getLargeMemoryClass() 会告诉您该堆有多大是。然而:
这仅适用于 API 级别 11+(即 Honeycomb 及更高版本)
无法保证大堆有多大
用户会感知到您的大堆请求,因为它会强制其他应用程序退出 RAM 终止其他应用程序的进程以释放系统 RAM 以供您的大堆使用
由于#3,以及我预计android:largeHeap 将被滥用的事实,将来可能会放弃对此的支持,或者可能会在安装时警告用户(例如,您需要为其申请特殊许可)
目前,此功能的文档很少
【讨论】:
inBitmap 上的BitmapOptions)。除此之外,删除对它们的所有引用,最终它们将被垃圾回收。
android:largeHeap 没有直接关系。但是,请求大堆可能会通过强制其他应用程序进程提前终止而损害整体用户体验。
您不能动态增加堆大小。
您可以通过在清单中使用android:largeHeap="true" 来请求使用更多。
另外,您可以使用 native memory (NDK & JNI) ,因此您实际上绕过了堆大小限制。
这里有一些关于它的帖子:
这是我为它制作的一个库:
【讨论】:
使用第二个过程。在AndroidManifest 声明新的Service 与
android:process=":second"
第一个和第二个进程通过BroadcastReceiver交换
【讨论】:
这可以根据您的 Android 操作系统通过两种方式完成。
android:largeHeap="true" 来请求更大的堆大小,但这不适用于任何预 Honeycomb 设备。VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);
在设置 HeapSize 之前,请确保您已输入适当的大小,不会影响其他应用程序或操作系统的功能。在设置之前,只需检查您的应用需要多少大小,然后设置大小以完成您的工作。不要使用太多内存,否则可能会影响其他应用程序。
参考:http://dwij.co.in/increase-heap-size-of-android-application
【讨论】:
据我所知,您可以在早期的 Android 版本中使用 VMRuntime 类,但现在您不能再使用了。
我不认为让开发人员在移动环境中选择堆大小可以被认为是安全的。我认为通过尝试从应用程序本身修改堆大小,您可以更容易地找到一种方法来修改特定设备(而不是编程端)中的堆大小。
【讨论】:
增加 Java 堆不公平地消耗了移动资源的不足。有时只需等待垃圾收集器,然后在堆空间减少后恢复操作就足够了。然后使用这个static method。
【讨论】: