NDK下载页面指出,"NDK的典型优秀候选者是独立的,CPU密集型操作,不会分配太多内存,例如信号处理,物理模拟等."
我来自C背景,并很高兴尝试使用NDK来操作我的大部分OpenGL ES函数和任何与物理,顶点动画等相关的本机函数......我发现我依赖于它点击原生代码,想知道我是否犯了一些错误.我在这一点上测试时没有遇到任何麻烦,但我很好奇我将来是否会遇到问题.
例如,我定义了游戏结构(有点像在San-Angeles示例中看到的).我正在动态加载对象的顶点信息(正好是活动游戏区所需要的),因此顶点,法线,纹理坐标,索引和纹理图形数据都会发生相当多的内存分配...只是为了命名要点.我非常小心释放游戏区域之间的分配.
我是否会更安全地设置阵列大小的上限或者我现在应该勇敢地向前冲锋?
在过去几年中,为了检查Android上的堆内存量以及使用量,可以使用以下内容:
@JvmStatic
fun getHeapMemStats(context: Context): String {
val runtime = Runtime.getRuntime()
val maxMemInBytes = runtime.maxMemory()
val availableMemInBytes = runtime.maxMemory() - (runtime.totalMemory() - runtime.freeMemory())
val usedMemInBytes = maxMemInBytes - availableMemInBytes
val usedMemInPercentage = usedMemInBytes * 100 / maxMemInBytes
return "used: " + Formatter.formatShortFileSize(context, usedMemInBytes) + " / " +
Formatter.formatShortFileSize(context, maxMemInBytes) + " (" + usedMemInPercentage + "%)"
}
Run Code Online (Sandbox Code Playgroud)
这意味着,您使用的内存越多,特别是通过将位图存储到内存中,您就可以越接近允许应用程序使用的最大堆内存.当您达到最大值时,您的应用程序将因OutOfMemory异常(OOM)而崩溃.
我注意到在Android O上(在我的情况下是8.1,但它也可能在8.0上),上面的代码不受Bitmap分配的影响.
进一步深入,我注意到在Android分析器中你使用的内存越多(在我的POC中保存大位图),使用的本机内存就越多.
为了测试它是如何工作的,我创建了一个简单的循环:
val list = ArrayList<Bitmap>()
Log.d("AppLog", "memStats:" + MemHelper.getHeapMemStats(this))
useMoreMemoryButton.setOnClickListener {
AsyncTask.execute {
for (i in …Run Code Online (Sandbox Code Playgroud)