我的游戏使用 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/