考虑到有限的记忆,我怎样才能优雅地降低我的表现?

时间:2012-04-03 02:36:03

标签: android memory-management out-of-memory

我花了最近几天试图消除游戏中的内存泄漏,导致许多内存不足错误。我即将添加大量的图形,虽然不是很复杂,但会大大增加我的系统的处理要求,我有点担心我的内存使用情况,我希望有人可能有给我一些提示。我不想低于Android 2.1,所以请为此定制任何答案。

首先,我的游戏包括:

  1. 2个活动,13个XML文件(一些与布局的一小部分有关,一些对话框,以及与活动直接相关的2个。
  2. 许多drawable,在Adobe Illustrator中制作并转换为PNG。这些可能很大,但并不是非常大,并且在大多数情况下,在任何给定时间内只有少量内存在内存中。
  3. 相当多的对话框。
  4. 针对Android 1.6及以上版本。
  5. 我使用了最新的Admob,因此,我必须建立3.2。
  6. 我的模拟器的默认堆大小约为24 MB。
  7. 我游戏中的一些示例图片:

    enter image description here

    enter image description here

    enter image description here

    我学到了什么:

    1. 尽管我的应用程序总大小只有500K左右,但按照adb shell procrank的计算,不知何时我占用24 Megs。
    2. 我做了相当多的优化,但没有看到内存大幅增加。
    3. 使用工具查找堆中的内容通常只显示大约7 MB,并且使用大约3 MB。有时候,在打开新的对话框之类的时候,我看到有所增加,但我不能说我觉得它有那么大......
    4. MAT表明我的课程都没有使用异常大的内存。
    5. 所以,鉴于所有这些,我的问题。

      1. 发展到(1.6+ android)的实际要求是24 Mb吗?
      2. 假设是,我怎样才能为可以处理它的系统提供更好的图形,但不能为旧系统崩溃和刻录?
      3. 我可以使用哪些常见问题来提高内存使用率?

1 个答案:

答案 0 :(得分:3)

如果没有看到您的实际代码,我无法说明以下内容是否与您相关。但是,值得一试。

如果您还没有这样做,可以考虑使用一种名为LruCache的东西。 http://developer.android.com/reference/android/util/LruCache.html

使用此工具,您可以确定您的缓存对象(例如位图)将在何时符合垃圾回收条件。因此,如果你想将其设置为4mb(例如),操作系统将尝试超越它时处理它。 (有关实现细节和一个很好的例子,请参阅文档)。

唯一的缺点是那个小宝石只带有3.2,所以你必须在AndroidManifest中制作你的min SDK,或者在运行时以编程方式检查api级别以确定你是否可以使用它。 Pre 3.2我会说你需要在你正在使用的任何位图上调用recycle(),但是如果你已经优化了,我会认为你已经做好了这个机会很好。

这是关于堆和本机内存之间差异的一个很好的小片段。 http://code-gotcha.blogspot.com/2011/09/android-bitmap-heap.html它可能(取决于你在做什么)帮助你理解为什么你没有看到你所期待的记忆力下降。

最后来自SO的帖子在处理堆大小时也应该有所帮助: Detect application heap size in Android

希望有所帮助。