19

NDK 下载页面指出,“NDK 的典型候选对象是独立的、CPU 密集型操作,不会分配太多内存,例如信号处理、物理模拟等。”

我来自 C 背景,很高兴尝试使用 NDK 来操作我的大部分 OpenGL ES 函数以及与物理、顶点动画等相关的任何本机函数......我发现我相当依赖有点本机代码,想知道我是否会犯一些错误。在这一点上,我在测试方面没有遇到任何问题,但我很好奇我将来是否会遇到问题。

例如,我定义了游戏结构(有点像在 San-Angeles 示例中看到的)。我正在动态加载对象的顶点信息(正是活动游戏区域所需要的),因此顶点、法线、纹理坐标、索引和纹理图形数据发生了相当多的内存分配......只是命名要领. 我对释放游戏区域之间分配的内容非常小心。

我会更安全地设置数组大小的上限,还是应该像现在这样勇敢地向前冲?

4

1 回答 1

10

由于使用 NDK 的应用程序的行为应该与使用 SDK 开发的应用程序类似,我认为合理堆使用的最佳指导来自ActivityManager.java的注释。

/**
 * Return the approximate per-application memory class of the current
 * device.  This gives you an idea of how hard a memory limit you should
 * impose on your application to let the overall system work best.  The
 * returned value is in megabytes; the baseline Android memory class is
 * 16 (which happens to be the Java heap limit of those devices); some
 * device with more memory may return 24 or even higher numbers.
 */
public int getMemoryClass() {
    return staticGetMemoryClass();
}

/** @hide */
static public int staticGetMemoryClass() {
    // Really brain dead right now -- just take this from the configured
    // vm heap size, and assume it is in megabytes and thus ends with "m".
    String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
    return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
}

为 Dalvik VM 设置堆大小的代码位于AndroidRuntime.cpp中,并提供了一个示例,说明如何使用property_get函数在本机代码中确定堆分配的粗略限制。

strcpy(heapsizeOptsBuf, "-Xmx");
property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "16m");
//LOGI("Heap size: %s", heapsizeOptsBuf);
opt.optionString = heapsizeOptsBuf;
mOptions.add(opt);

的默认值16m可能很重要,因为我拥有的两部 Android 手机都没有dalvik.vm.heapsize默认设置该属性。

于 2010-06-16T03:17:22.127 回答