2

我正在为 SDK >= 8 构建的 Android 下开发游戏应用程序。我总是在 Android 2.2 手机下测试它,从来没有遇到过问题。当我搬到装有 ICS 的 Nexus 手机时,我开始遇到堆内存分配问题。我试图删除应用程序中的所有内容,以查看哪里有内存泄漏问题或奇怪的分配(在 Eclipse 下使用 DDMS 和 MAT),直到我决定只启动一个空活动并且什么都不做。

在 Android 2.2 下,启动时的堆大小约为 2.0MB,而在 Android 4.1 下约为 11MB。为什么会有这么大的差异?

此外,当我在 ICS 上以堆大小播放我的应用程序时,垃圾收集器迅速开始释放内存,整个应用程序变得缓慢且 FPS 非常低。在 Android 2.2 下,一切都非常流畅和干净,没有任何问题。

有谁可以建议我这两个系统之间的区别在哪里?我不想谈论我的应用程序实现(我已经花了 2 周时间优化代码、内存分配和保留以及其他所有内容。不能做更多),但我想了解所有内存在应用程序启动时的去向. 此外,ICS 似乎需要更多内存来加载和保留位图和可绘制对象。

4

1 回答 1

0

好吧,我可能迟到了,但我找到了你(和我)问题的根源。

在 Android 3.0 之前(不确定这是否在整个 1.x/2.x 系列中)所有与位图相关的内存都没有存储在堆上。因此,在 3.0 中,他们开始在堆上定位所有内容。我不确定为什么一个空的应用程序会占用 11MB,我只能猜测它与应用程序中使用的默认 Android 位图有关。

现在还有另一个问题:在早期版本的 Android 中,只有“drawable”文件夹,没有“drawable-hdpi”、“drawable-mdpi”等文件夹。出于某种原因,当从“drawable”文件夹加载图像时,它会占用大量空间。解决方案是将图像的不同分辨率变体添加到所有drawable-Xdpi(其中 X 是 l、m、h 或 xh)文件夹。它将我的起始堆大小从大约 26MB 减少到了 16MB。即使您不调整它们的大小,而只是将它们复制粘贴到文件夹中,它仍然会导致位图大小发生相当大的变化。

我希望我通过发布这个来帮助一些人。

-Z

于 2013-08-13T15:53:59.303 回答