使用许多位图时出现内存不足错误

时间:2011-10-28 11:02:09

标签: android bitmap out-of-memory

我想在游戏画布上使用很多位图。

我不能Recycle位图,因为我必须在整个部分使用位图。

为我的基于画布的游戏应用程序提供一些指导来优化代码以处理许多位图,同时提高性能。

目前我正在使用以下代码从drawable资源中获取位图

    BitmapFactory.Options bfOptions=new BitmapFactory.Options();
    bfOptions.inSampleSize = 1;
    bfOptions.inDither=false;                     //Disable Dithering mode
    bfOptions.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
    bfOptions.inInputShareable=true;              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
    bfOptions.inTempStorage=new byte[16 * 1024]; 

    myBitMap=BitmapFactory.decodeResource(getResources(),ID, bfOptions);

我目前正在关注此code进行画布绘制。

图像是精灵的,所以在尝试加载许多精灵时会给出问题。

在此代码链接 MainGamePanel.java 是我正在做的事情。对于位图解码我使用上面的方法。

2 个答案:

答案 0 :(得分:1)

如果你必须使用很多位图并且位图可以轻松搞定,例如,它是从互联网上下载的,你可以尝试使用SoftReference来引用它而不是强引用。你试过这种方法吗?

答案 1 :(得分:1)

对于非常有用的优化建议,了解有关您想要优化的内容(绘图速度,内存占用量)以及游戏画布应满足的要求以及要绘制的图像类型的更多详细信息将非常有用。 (大,小,重复,他们可以打破,平铺可能)。

我可以考虑一些你可以考虑的一般性想法:

  • 您确定,您无法重复使用您的位图吗?我认为在大多数游戏中,这是可能的。也许你可以进一步分割你的图像?
  • 您可以缩小图像(或者,如果可能,请通过libsvg使用svg图像 - 有关详细信息,请参阅https://launchpad.net/libsvg-android
  • 如果您想优化绘图所需的时间,预加载图片可以改善
  • 您可以使用绘图线程绘制画布,而不是依靠android来自动重绘视图。有关详细信息,请参阅SurfaceHolder.lockCanvas(...)和SurfaceHolder.unlockCanvasAndPost(...)。
  • 如果您确实需要出色的绘图速度,请考虑使用open gl。