如何避免Android应用程序的图形内存不足?

时间:2010-05-10 06:27:27

标签: android graphics memory-management

我一直在使用Eclipse中的Android应用程序,到目前为止,我的程序还没有真正增长到小尺寸。但是我已经遇到内存不足错误的问题。你看,我在这个程序中一直使用仅由位图和PNG组成的图形,最近,当我尝试为程序添加更多功能时(主要包括更多的位图并导致创建额外的精灵) ),它开始在图形线程的构造函数中崩溃 - >精灵的构造函数。当我跟踪问题时,结果是内存不足错误,这似乎是由于向程序添加了太多图片文件并从中创建了Drawables而引起的。

这将是一个问题,因为我真的没有那么多的图片资源进入该程序...可能20左右。我还没有开始包括声音。这些图像并不那么花哨。我的问题是:

1)Android手机的程序是否真的限制了它们可以使用多少内存,或者它是否可能是导致该错误的20-30个资源图片之外的东西?

2)如果Android应用程序的内存非常糟糕,它甚至无法处理20-30个图片资源被加载到同时存在的Drawables中,那么你应该如何制作体面的图形和声音那件事?

感谢。

5 个答案:

答案 0 :(得分:3)

正如史蒂夫和保罗已经提到的,关键因素是你的图像有多大。标准手机上的Android应用程序限制为16Mb,而hidef手机上限制为24Mb。这是一个硬性限制。这严重限制了您拥有的图形数量。

计算图形大小很容易:宽x高x像素大小(16或32位)。

一些提示:

  • 您需要仔细检查代码是否存在内存泄漏。在Android中泄漏内存非常容易,如果几次泄漏几个位图,就会快速耗尽内存。 This article may help.
  • 如果可能,请始终使用ARGB_4444(16位)加载图形。仅此一项,可以将图形的内存消耗减少2倍。
  • 如果可以的话,请始终为空并回收资源,以协助gc。
  • 尽量确保图形仅使用一次。拥有一个处理这个问题的资源处理类非常有用(至少如果你正在做游戏)。

答案 1 :(得分:2)

最简单的方法是将这两行添加到应用程序标记

中的清单中

机器人:硬件加速= “假” android:largeHeap =“true”

但是,如果您正在构建一个内存效率高的应用程序,则不推荐这些。但这确实有效。

答案 2 :(得分:1)

嗯....我已经编写了带有大量静态图像的Android应用程序(即用于帧动画),所以阅读你的问题引发了一些问题:

  • 您使用的是哪种运行环境?这是使用SDK模拟器,还是在真实手机上运行?如果您在模拟器中,您可能希望确保使用与手机匹配的规格创建它(即使这样,由于手机具有专用硬件,它可能会比在手机上运行速度慢)。

  • 您是否需要同时加载所有Drawable?例如,如果您反复绘制图像,是否每次绘制时都会创建一个Drawable,或者您可以重复使用相同的Drawable并简单地调整Rect实例以进行实际调用?

  • 同样,您可以按需加载它们吗?例如。如果你有一个相册应用,你可以只显示照片1-9,并在用户点击下一步按钮后加载照片10-19吗?

  • 你的图片大吗?高密度?

我意识到这些是高水平的,难以应用;我不认为我对你的问题可能来自描述有什么好处。我自己也遇到了一些麻烦,并且通过仔细研究真正使用new关键字所需的频率来获得最大的节省,以及对于显示和什么不是。我还发现the page on optimizing for performance非常有用(我主要是制作游戏,some examples here)。

祝你好运!

答案 3 :(得分:1)

您尝试加载的图片尺寸 非常 很重要。如果它们很小(例如50x50),你可以很容易地加载几十个位图,但如果每个位图足够大以填满屏幕,你就不能做多于几个位图。它还取决于您尝试对这些图像执行的操作。例如,如果你试图将图像平滑地旋转90度,即使是大约300x300px的东西也足以杀死应用程序。

您需要做一些事情。

  1. 在您需要之前尽量不要加载图像。
  2. 尽可能减少图形细节。例如,您可以将位图解码为RGB 565,ARGB_4444或ARGB_8888,每个位图占用不同的内存量。在解码图像时使用BitmapFactory.Options对象作为参数进行设置。
  3. 看看你是否可以“作弊” - 例如,内存更容易拍摄一张小图像,并且一遍又一遍地重复图像(如瓷砖)填满屏幕,而不是使用一张大图像。它也更容易处理一个你希望它的四分之一大小的图像,但是用2倍的比例因子绘制。
  4. 阅读此article from the developer of Light Racerhis follow-ups,了解调整性能是如何在开发游戏时最困难但最重要的事情之一。

答案 4 :(得分:0)

内存泄漏和创建Drawables没有任何理由不是问题,除了我会在一秒钟内提到的事情。然而,你们所提到的其他事情都是有价值的信息。这是一个我一直在努力制作的视频游戏,所以从我能辨别出来的,不断创建和删除Drawables是不切实际的,这取决于它们是否正好在第二个屏幕上显示;对于精灵来说,我相信我需要保持物品装载,直到那些精灵本身被消除,而不是简单地离开屏幕。至于错误,我基本上只是在程序启用过程中将太多的Drawables加载到内存中。

现在我刚才想到的一件事 - 这不是造成这个特殊错误的原因,但它会导致类似的错误 - 是我为每一个创建了一系列drawables精灵,当我刚才注意到我应该只对每种精灵都这样做。

我将不得不研究将图形缩小到16位的精确方法,因为这个应用程序的大部分都不需要花哨的东西。我想我会监视这个帖子再过几天,以防其他人有任何其他想法,然后我会标记它已经回答了。谢谢你们。