【问题标题】:android dalvik memory limit? out-of-memory exceptionandroid dalvik内存限制?内存不足异常
【发布时间】: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


【解决方案1】:

5M 的顶点数据对于移动环境来说是相当多的。如果您还加载纹理,请考虑仅加载压缩纹理。您还可以在将某些资源移至 GPU 驱动程序后释放它们。我会离线准备您的顶点数据,并且只在运行时加载所需的数据。另一种选择是计算部分数据,或直接在顶点/片段着色器处展开(例如在 GPU 端生成双切线)。

【讨论】:

  • 您似乎是该主题的专家。我不知道双切线是做什么用的。您还可以展示有关如何加载和使用压缩纹理的 sn-p 吗?我的纹理很大。
  • 如果您不了解双切线,请不要担心。这是一个高级话题。关于加载压缩纹理,您可以在这里找到更多信息:stackoverflow.com/questions/9148795/…
猜你喜欢
  • 2012-10-24
  • 2023-03-06
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多