安卓开发 : Bitmaps on surfaceview leak Memory or too big?

标签 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:我真的需要帮助-.-

最佳答案

我在 SurfaceView 上也使用了很多位图,没有这个问题。 对于动画 Sprite ,您可以使用 Sprite 表,而不是逐帧单独加载它们。

您不需要使用“已调整大小”的引用,您只需说:

player = Bitmap.createScaledBitmap(player, width/10, width/6, true);

旧位图将失去其引用并被 GC 收集。请注意,我在重新缩放时为位图过滤设置了 TRUE 以获得更好的质量。

在某些设备上,onSizeChanged 可能发生两次,这可能会调整位图大小两次,如果那是您进行缩放的地方。

无论是 ARGB_4444 还是 ARGB_8888 等,加载位图的格式都会有所不同,因此您可能需要探索此选项,如果您可以使用需要较少内存但对您的游戏具有足够好的质量的格式。当然,规则是不要在需要时将图像加载到比需要的更大的内存中。

关于安卓开发 : Bitmaps on surfaceview leak Memory or too big?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6953484/

相关文章:

android - Facebook 在不打开对话框的情况下在墙上发布消息

带有 BaseAdapter 拖放排序的 Android ListView

java - Android 4.0.3 进度对话框关闭

java - Java中变量的内存地址

c - 非动态数组何时在结构中释放

c# - 当内存转储显示使用的内存很少时调试内存不足情况

c# - 如果实例已被处置,则在不调用 EndXXX 的情况下调用 BeginXXX 是否安全

android - 具有可绘制背景和可绘制左侧的样式按钮

c++ - 将可变大小数组传递给 DLL 的选项有哪些?

python - 为什么要设置一个绑定(bind)方法给 python 对象创建一个循环引用?