应用程序突然不会加载位图

时间:2011-08-22 20:17:53

标签: android memory bitmap heap

我正在开发一款即将完成的Android游戏,但在上周突然加载游戏中使用的Bitmap资产会引发内存错误。

主要的Bitmap特别是它抛出的错误是237kb和1792X1024(32位)。这是一个玩家的精灵表,这就是为什么它如此之大,奇怪的是它用于加载我实际上可以加载一个图像,这是400X800 32位文件的游戏地图,413KB没有任何问题(这不是一个错字,较小的分辨率/相同的位文件看起来更大。我不完全确定为什么,但我认为它与所涉及的颜色或精灵表主要是透明的事实有关)。所有图像都是在GIMP中创建的。

我不确定是什么引发了错误,因为除了android API的更新之外,代码中的任何内容都没有变化(尽管它会在早期测试之前随机出错)。我还尝试在一个新项目中仅加载此spritesheet,它会抛出错误,但不会在另一个更大的文件中加载。

为了让事情变得更奇怪,我从测试手机上备份了一个APK,当时游戏没有抛出错误我甚至尝试解码png spritesheet并使用这个精确的图像(它仍然会抛出错误)。它不会抛出错误的唯一方法是将VM最大堆增加到24MB以上(默认情况下,我尝试过的最小值为48MB,这样可以正常运行,但加载速度比以前慢很多。)

这是一个可能出现的明显问题,还是在SDK中做了一些我不知道的事情?尝试使用我在多个电路板上找到的不同方法,包括使用Bitmap.options设置样本大小,清单调整,在调整大小时更改它,System.gc(),{{1等等。

有谁知道这里会发生什么?

2 个答案:

答案 0 :(得分:0)

我怀疑你的实际内存位图真的是237KB。我猜你有一个237KB的PNG,但解码后的位图在内存中要大得多。 PNG使用一种无​​损压缩形式。至于为什么它之前有效但不是现在我不确定,但是我对你的内存位置不足以及最大的一点感到惊讶。

您可以使用工具来压缩/生成精灵表。这样的事情可能有用:

http://spritesheetpacker.codeplex.com/

答案 1 :(得分:0)

如果您收到OutOfMemory错误,那么我遇到了同样的问题并修复如下。我真的认为这是本机Bitmap代码中的一个错误。

以下是我所做的:不要使用BitmapFactory.decodeStreamBitmapFactory.decodeFile。而是使用BitmapFactory.decodeFileDescriptor

如果这对你有用,请告诉我,因为它有助于确认其他方法是否确实存在错误。