我一直在使用Eclipse中的Android应用程序,到目前为止,我的程序还没有真正增长到小尺寸。但是我已经遇到内存不足错误的问题。你看,我在这个程序中一直使用仅由位图和PNG组成的图形,最近,当我尝试为程序添加更多功能时(主要包括更多的位图并导致创建额外的精灵) ),它开始在图形线程的构造函数中崩溃 - >精灵的构造函数。当我跟踪问题时,结果是内存不足错误,这似乎是由于向程序添加了太多图片文件并从中创建了Drawables而引起的。
这将是一个问题,因为我真的没有那么多的图片资源进入该程序...可能20左右。我还没有开始包括声音。这些图像并不那么花哨。我的问题是:
1)Android手机的程序是否真的限制了它们可以使用多少内存,或者它是否可能是导致该错误的20-30个资源图片之外的东西?
2)如果Android应用程序的内存非常糟糕,它甚至无法处理20-30个图片资源被加载到同时存在的Drawables中,那么你应该如何制作体面的图形和声音那件事?
感谢。
答案 0 :(得分:3)
正如史蒂夫和保罗已经提到的,关键因素是你的图像有多大。标准手机上的Android应用程序限制为16Mb,而hidef手机上限制为24Mb。这是一个硬性限制。这严重限制了您拥有的图形数量。
计算图形大小很容易:宽x高x像素大小(16或32位)。
一些提示:
答案 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的东西也足以杀死应用程序。
您需要做一些事情。
答案 4 :(得分:0)
内存泄漏和创建Drawables没有任何理由不是问题,除了我会在一秒钟内提到的事情。然而,你们所提到的其他事情都是有价值的信息。这是一个我一直在努力制作的视频游戏,所以从我能辨别出来的,不断创建和删除Drawables是不切实际的,这取决于它们是否正好在第二个屏幕上显示;对于精灵来说,我相信我需要保持物品装载,直到那些精灵本身被消除,而不是简单地离开屏幕。至于错误,我基本上只是在程序启用过程中将太多的Drawables加载到内存中。
现在我刚才想到的一件事 - 这不是造成这个特殊错误的原因,但它会导致类似的错误 - 是我为每一个创建了一系列drawables精灵,当我刚才注意到我应该只对每种精灵都这样做。
我将不得不研究将图形缩小到16位的精确方法,因为这个应用程序的大部分都不需要花哨的东西。我想我会监视这个帖子再过几天,以防其他人有任何其他想法,然后我会标记它已经回答了。谢谢你们。