我正在编写一个使用多个3D模型的Android应用程序。这样带有纹理的模型可能会占用大量内存。我发现制造商设置了应用程序可以使用堆大小的限制。例如,我的平板电脑三星Galaxy Tab 8.9 P7310可以使用64MB的内存。
有没有办法增加应用程序可以使用的内存大小?
我正在编写一个使用多个3D模型的Android应用程序。这样带有纹理的模型可能会占用大量内存。我发现制造商设置了应用程序可以使用堆大小的限制。例如,我的平板电脑三星Galaxy Tab 8.9 P7310可以使用64MB的内存。
有没有办法增加应用程序可以使用的内存大小?
您可以使用android:largeHeap="true"来请求更大的堆大小,但这在任何早于Honeycomb版本的设备上都不起作用。在2.3以前的设备上,您可以使用VMRuntime类,但在Gingerbread及以上版本上不起作用。
拥有尽可能大的限制的唯一方法是通过NDK执行内存密集型任务,因为NDK不像SDK那样强制实施内存限制。
或者,您可以仅加载当前可见部分的模型,并在需要时加载其余部分,同时从内存中删除未使用的部分。然而,这取决于您的应用是否可以这样做。
BitmapOptions
中的inBitmap
)。除此之外,删除所有对它们的引用,最终它们将被垃圾回收。 - CommonsWareandroid:largeHeap
相关。然而,请求大堆可能会损害用户的整体体验,因为它会迫使其他应用程序进程比本来需要的更早地终止。 - CommonsWare无法动态增加堆大小。
可以在清单文件中使用android:largeHeap="true"
来请求使用更多。
同时,您也可以使用本地内存(NDK和JNI)
,这样实际上就绕过了堆大小限制。
以下是一些我写的帖子:
这是我为此创建的库:
使用第二个进程。在 AndroidManifest
中声明一个新的 Service
。
android:process=":second"
使用BroadcastReceiver
在第一和第二进程之间进行交互
根据您的Android操作系统,有两种方法可以实现。
android:largeHeap="true"
来请求更大的堆大小,但这不适用于任何早期版本的Honeycomb设备。VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);
在设置堆大小之前,请确保您输入的大小是适当的,不会影响其他应用程序或操作系统功能。在进行设置之前,仅检查您的应用程序占用了多少空间,然后设置大小以满足您的工作需求。不要使用过多的内存,否则可能会影响其他应用程序。
参考:http://dwij.co.in/increase-heap-size-of-android-application
据我所知,在早期的Android版本中,您可以使用VMRuntime
类,但现在不再支持。
我认为在移动环境中允许开发人员选择堆大小并不是很安全。我认为更容易找到一种方法来在特定设备上修改堆大小(而不是在编程方面尝试从应用程序本身进行修改)。
largeHeap=true
赢了 - Luis ArtolaPlayerSettings
中选择构建类型为Il2CPP
,Unity可以构建到C++ 链接,因此我认为如果我们想要做任何需要良好性能的重型任务,我们可以通过Unity构建它,将其导出到模块并将该模块导入到Android。 - DungPhan