Android开发:Surfaceview上的位图泄漏内存还是太大了?

时间:2011-08-05 08:31:04

标签: android memory-management memory-leaks bitmap

我的游戏使用了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:我真的需要帮助-.-

2 个答案:

答案 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。

计算在任何给定时间你有多少分配堆,看看它是否随着时间的推移而增加,即使你知道你没有分配新的位图。如果是,那么是的,你有内存泄漏。但是,如果您的应用程序在启动时崩溃,那么您可能只是超出了堆限制。