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

标签 android bitmap out-of-memory

我想为我的游戏 Canvas 使用很多位图。

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

请提及一些优化代码的准则,以处理许多位图,同时提高我基于 Canvas 的游戏应用程序的性能。

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

    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用于在 Canvas 上绘图。

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

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

最佳答案

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

我脑海中浮现出一些您可以考虑的一般想法:

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

关于android - 使用许多位图时出现内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7928353/

相关文章:

java - 将 LibGDX 像素图转换为 Android 位图

android - 如何使用 Open GL ES 在 Android 中加载巨大的位图?

c# - Windows Phone 8 上的内存泄漏

java - 如何让HttpURLConnection setConnectTimeout在Android下工作?

android - 从 firebase 数据库 android 检索数据

android - Google Drive Api 在发布应用程序后停止工作

c# - 在循环中创建位图时出现内存溢出异常

java - Gradle 和 Android Studio

asp.net - Linq to Entities 和 SQL Server 2008 FileStream

c# - 运行测试时特定机器上出现 OutOfMemoryException