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

问题描述:

我正在为即将完成的android游戏工作,但在上周突然加载的游戏中使用的Bitmap资产正在抛出内存错误。应用程序突然不会加载位图

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

我不确定是什么启动了错误,因为除了android API的更新(尽管它会在早期测试之前会随机给出错误),代码中的任何内容都没有任何变化。我也曾尝试只在这个spritesheet中加载一个新的项目,它会抛出错误,但不会放在其他更大的文件中。

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

这是一个可能的清单问题,或做了一些我不知道的SDK更改吗?我一直在试图解决这一几天尝试不同的方法,我在许多主板包括Bitmap.options设置样本大小,明显的调整发现,改变它的大小调整,System.gc()recycle()

没有人有任何想法可能会发生在这里?

+4

位图的重要大小不是压缩大小(您在此处声明),而是未压缩位图的内存大小,对于1792x1024位图而言,它将接近8 MB,对于400x800位图仅为1.3 MB 。 – antlersoft

+1

请显示您的LogCat输出。 –

+0

你说你还有旧的APK--它是否在新的Android API上正确运行,或者现在是否也会抛出错误? – antlersoft

我怀疑你的实际内存位图是真的237KB。我猜你有一个237KB的PNG,但解码后的位图在内存上要大得多。 PNG使用一种无​​损压缩的形式。至于为什么它以前工作,但不是现在,我不确定,但我毫不惊讶地发现你的内存位置很大。

您可以使用工具压缩/生成精灵表。像这样的东西可能是有用的:

http://spritesheetpacker.codeplex.com/

+0

是的,这是一个PNG不是位图,它是一个位图对象是我的意思。我想我最终会通过调整动画上相机的POV并旋转精灵表来缩小尺寸。 – UpSNAP

如果您收到一个OutOfMemory错误,然后我有同样的问题,并固定它,如下所示。我真的认为这是本地位图代码中的一个错误。

这是我做的:不要使用BitmapFactory.decodeStreamBitmapFactory.decodeFile。相反使用BitmapFactory.decodeFileDescriptor

如果这对您有用,请让我知道,因为这将有助于确认其他方法是否存在真正的错误。

+0

我实际上使用BitmapFactory.decodeResource(getResources(),R.drawable.image),是否有相应的重载方法从R.java文件拉入? – UpSNAP

+0

我认为你可以做些像resources.openRawResourceFD(R.drawable.image).getFileDescriptor() – Fraggle

+0

我最终通过制作一个方向精灵并旋转它们(通过一些对齐调整)来缩小位图的大小。这在某种程度上取消了3d效果,但在这种情况下应该没问题。仍然不确定为什么这突然开始出现错误,但我最终在优化阶段最终缩小了图像大小。 – UpSNAP