【发布时间】:2011-08-22 20:17:53
【问题描述】:
我正在开发一款即将完成的 Android 游戏,但在上周,游戏中使用的位图资源的加载突然引发了内存错误。
特别是它引发错误的主要位图是 237kb 和 1792X1024(32 位)。这是一个玩家的精灵表,这就是为什么它这么大,奇怪的是它用来加载,我实际上可以加载一个图像,它是 400X800 32bit 文件的游戏地图,它是 413KB 没有任何问题(这不是错字,较小的分辨率/相同位文件看起来更大。我不完全确定为什么,但我假设它与所涉及的颜色或精灵表主要是透明的事实有关)。所有图像均在 GIMP 中创建。
我不确定是什么导致了错误,因为除了更新 android API 之外,代码中的任何内容都没有变化(尽管在早期测试之前它会随机给出错误)。我还尝试在一个新项目中仅加载这个 spritesheet 本身,它会引发错误,但不是在另一个更大的文件中。
为了让事情变得更奇怪,我有一个从测试手机备份的 APK,当游戏没有引发错误时,我什至尝试解码 png spritesheet 并使用这个精确的图像(它仍然会抛出错误)。让它不抛出错误的唯一方法是将 VM 最大堆增加到 24MB 以上(我尝试过的默认最小堆是 48MB,这很有效,但加载速度比以前慢了很多)。
这可能是一个明显的问题,还是 SDK 中发生了我不知道的更改?几天来,我一直在尝试解决这个问题,尝试了我在许多板上找到的不同方法,包括使用Bitmap.options 设置样本大小、清单调整、在调整大小时更改它、System.gc()、recycle() 等。
有人知道这里会发生什么吗?
【问题讨论】:
-
位图的重要大小不是压缩大小(您在此处说明),而是未压缩位图在内存中的大小,对于 1792x1024 位图,它将接近 8 MB,只有 1.3 MB 为您的 400x800 位图。
-
请显示您的 LogCat 输出。
-
你说你还有旧的 APK——它在新的 Android API 上可以正常运行还是现在也抛出错误?
-
奇怪的是,是的,当我卸载新的 adb install 后,旧的仍然有效。还有一点需要注意的是,当我增加内存时,新的尺寸看起来像屏幕尺寸增加了一倍(换句话说,游戏/布局被绘制得比以前更小,而不是填满屏幕)。可能是manafest中的某些更改导致了这种情况吗?
-
日志猫和做内存分析/调试基本上告诉我精灵表是问题(我将减小大小来修复它,除非有人能告诉我一个可以修复它的清单更改原样)。复制如下:08-23 13:27:27.191: ERROR/dalvikvm-heap(266): 16515072-byte external allocation too large for this process。 08-23 13:27:27.191:错误/(266):VM 不允许我们分配 16515072 字节 08-23 13:27:27.191:调试/AndroidRuntime(266):关闭 VM 08-23 13:27: 27.191: WARN/dalvikvm(266): threadid=3: thread exiting with unaught exception (group=0x4001b188) etc.
标签: android memory bitmap heap-memory