【发布时间】:2013-01-10 06:33:45
【问题描述】:
加载 5M 大小的 3D OBJ 模型时内存不足。调试显示 dalvik 在模拟器或设备上具有 50M 内存限制。我不明白这是为什么。
mIndicesInt = ByteBuffer.allocateDirect(indices.length * INT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asIntBuffer();
mIndicesInt.put(indices).position(0);
我什至将 AVD RAM 增加到 2048M,堆增加到 1024M,但没有帮助。它总是以相同的数字停止:
D/setIndices(2270):内存:Pss=67.88 MB,私有=66.09 MB,共享=13.30 MB D/setIndices(2270):maxMem=50331648 D/setIndices(2270):totalMem=50208736 D/setIndices(2270): freeMem=1963736
OBJ 模型包含 20 多个对象。我删除了几个对象,然后内存不足问题消失了,所以这是每个进程的内存硬限制问题?
对处理它有什么建议吗? 增加 RAM 和堆大小的 AVD 选项也没有效果,为什么?
【问题讨论】:
-
看起来类似于stackoverflow.com/questions/3078301/… 我并不是说它实际上是重复的。只是你可能会从那里得到一些好的信息。一方面,内存限制似乎是“硬编码”的,并且如果不root手机就无法更改。
-
感谢您指出这一点。我在内存不足的情况下进行了搜索,但没有点击该线程。
-
您是否尝试过在 JNI/native 代码中进行分配并发送对 java 代码的引用?据我所知,本机堆可以变得非常大。另一种选择是内存映射文件,因为显然这不会计入您的堆限制:groups.google.com/forum/?fromgroups=#!topic/android-ndk/…,MMapp IO 链接:developer.android.com/reference/java/nio/channels/… 特别查看 map(...) 方法。当您打开文件(例如使用 fileInputStream)时,使用方法 .getChannel() 来获取对 .map(...) 所需的 FileChannel 的引用。
-
感谢您指出这些。我会看看那些链接。
-
我认为你应该重新考虑你的策略。根据设备的不同,Android 堆大小可以小至 32 甚至 24 MB。我已经在单独的 PC 实用程序应用程序中实现了所有 OBJ 解析,该应用程序生成准备好上传到 GPU 的二进制数据。数百万倍的速度并且不消耗内存。我刚刚将适用于 OBJ 的代码从 Android 应用程序迁移到控制台 Java 应用程序。
标签: android android-emulator opengl-es-2.0 out-of-memory