【问题标题】:Out of Memory Error while using many bitmaps使用多个位图时出现内存不足错误
【发布时间】:2011-10-28 11:02:09
【问题描述】:

我想为我的游戏画布使用许多位图。

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

请提及一些优化代码以处理许多位图的指南,同时也为我的基于画布的游戏应用程序提供更快的性能。

目前我正在使用以下代码从可绘制资源中获取位图,

    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 在画布上绘图。

图像在 sprite 中,因此在尝试加载许多 sprite 时会出现问题。

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

【问题讨论】:

  • 您需要发布一些代码供人们提供优化指南。

标签: android bitmap out-of-memory


【解决方案1】:

对于真正有用的优化建议,了解更多关于您想要优化的具体内容(绘制速度、内存占用)、游戏画布应满足的要求以及您想要绘制的图像类型的详细信息将是有益的(大的,小的,重复的,可以分解,可以平铺)。

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

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

【讨论】:

    【解决方案2】:

    如果你必须使用很多位图,并且位图很容易获得,例如从互联网上下载,你可以尝试使用SoftReference来引用它而不是强引用。你试过这种方式吗?

    【讨论】:

    • 我只从本地可绘制对象中获取所有内容......我已经提到了问题本身......
    • 我的意思是你可以使用 SoftReference 来避免在内存中保留太多的可绘制对象,你能发布更多代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多