2010-06-14 75 views
15

NDK下载页面指出:“NDK的典型优秀候选者是独立的,CPU密集型操作,不会分配太多内存,如信号处理,物理模拟等等。”NDK中的内存分配量是多少?

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

例如,我已经定义游戏结构(有点像被认为是在圣-洛杉矶例子)。我正在动态加载对象的顶点信息(正好是活动游戏区所需要的),所以对于顶点,法线,纹理坐标,索引和纹理图形数据都有相当多的内存分配......只是为了说明基本要素。我非常小心释放游戏区域之间分配的内容。

我会更安全的数组的大小设置一些帽子,或者我应该勇敢地冲锋向前,我现在要去哪里?

回答

9

由于使用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虚拟机是在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属性默认设置的可能非常重要。

+0

谢谢蒂姆。这有点吓人,保持在16MB以下。如果我理解这个权利,那么可以通过手机制造商构建的操作系统来实现上限,以便每个应用程序只能访问一定数量的内存。如果没有设置上限,那么每个应用程序可以根据需要从可用RAM中分配尽可能多的内容(当然,因为它需要)?你是说当getMemoryClass()在手机上运行时,它们返回null?你有哪些手机,如果我可能如此大胆地问...有没有可能有关于新手机限制信息的地方? (我完全脱离基地吗?) – Maximus 2010-06-16 14:32:37

+5

我真的应该首先在Dianne Hackborn搜索NDK团队...... “另外,鉴于这是NDK列表,实际上并没有强加给你,因为它只在Java堆上。本地堆中的分配没有限制......” 她确实继续说它不应该被滥用,如果是,应用程序可能会被杀死。这是主题,一般来说,这是一个很好的主题阅读。 http://groups.google.com/group/android-ndk/browse_thread/thread/95c9f0cecceb112a/ab033b9a28d52fcd?lnk=gst&q=heap+limit#ab033b9a28d52fcd – Maximus 2010-06-16 15:03:33

+1

@Maximus戴安娜的意见概括起来非常好。尽管NDK可以分配多少堆没有限制(运行'ulimit -d'返回'unlimited'),但使用所有可用内存会带来一些后果。 – 2010-06-17 04:12:14