我的游戏使用了surfaceview(我知道我应该使用GL)。 我在我的游戏角色世界控制中绘制了很多位图。当我打开LogDog时,我遇到了这个问题:
08-05 10:17:29.151: ERROR/dalvikvm(24048): Out of memory: Heap Size=5379KB, Allocated=2735KB, Bitmap Size=20576KB, Limit=32768KB
我不知道它是否泄漏或是什么。
我的分配跟踪器显示:
喜欢30:
138 96 char[] 9 android.content.res.AssetManager getCookieName
然后 吨:
32 80 android.graphics.BitmapFactory$Options 9 android.graphics.BitmapFactory decodeResource
最后: 像30:
141 56 android.graphics.Bitmap 9 android.graphics.BitmapFactory nativeDecodeAsset
还有一些类似的。
以下是一些我认为会耗尽我记忆的代码:
player = BitmapFactory.decodeResource(getResources(), R.raw.ghostright);
world = BitmapFactory.decodeResource(getResources(), R.raw.lvl2);
thumb = BitmapFactory.decodeResource(getResources(), R.raw.thumb);
resized = Bitmap.createScaledBitmap(player, width/10, width/6, false);
player = resized;
resized = Bitmap.createScaledBitmap(world, height*10, height, false);
world = resized;
resized = Bitmap.createScaledBitmap(thumb, height/6, height/6, false);
thumb = resized;
我听说我应该使用resycle,但我不知道在哪里,因为我总是使用位图
//西蒙 PS:我真的需要帮助-.-
答案 0 :(得分:1)
我在SurfaceView上也使用了很多位图,并且没有这个问题。 当谈到动画精灵时,你可以使用精灵表而不是逐帧加载它们。
您不需要使用“已调整大小”的引用,您只需说:
player = Bitmap.createScaledBitmap(播放器,宽度/ 10,宽度/ 6, true );
旧的位图将丢失其引用并由GC收集。请注意,我在重新缩放时为位图过滤设置了TRUE,以提高质量。
在某些设备上,onSizeChanged可能会发生两次,这可能会两次调整位图大小,如果这是你正在进行缩放的地方。
无论是ARGB_4444还是ARGB_8888等,加载位图的格式都会有所改进。因此,您可能需要探索此选项,如果您可以使用需要较少内存的格式,那么它的游戏质量就足够了。当然,规则不是将图像加载到比需要更大的内存中以及何时需要它们。
答案 1 :(得分:1)
它不必是内存泄漏,它可能只是你有如此大的位图,他们想要分配给大量的内存。这是确定位图将占用多少内存的好方法:W * H * 8。因此,如果您的位图为300 * 300像素,则为300 * 300 * 8 = 720 kb。
计算在任何给定时间你有多少分配堆,看看它是否随着时间的推移而增加,即使你知道你没有分配新的位图。如果是,那么是的,你有内存泄漏。但是,如果您的应用程序在启动时崩溃,那么您可能只是超出了堆限制。