java - 游戏开发时位图大小超过VM预算

标签 java android out-of-memory dalvik

我正在开发一款安卓游戏,比如塔防。 我正在使用表面 View 。我正在使用一些图像作为位图。(Spritesheets、tilesets、按钮、背景、效果对比) 现在图像将近 5-6 mb。我在运行游戏时遇到此错误:

Bitmap size exceeds VM budget

19464192-byte external allocation too large for this process.

我这样称呼图像

BitmapFactory.decodeResource(res, id)

然后我把它放到数组中。 我无法缩放图像。我正在使用所有图像。 我试过了

options.inPurgeable=true;  

它可以工作,但图像加载速度非常慢。我用它加载了一个 spritesheet,当它加载时,我的 fps 非常非常低。

我能做什么?

最佳答案

我也遇到过这个问题;除了减少一次加载的位图的数量/大小之外,真的没有其他解决方案。一些较旧的 Android 设备只为您的整个应用程序分配 16MB 到堆,并且位图在您加载它们后存储在未压缩的内存中,因此在大背景等情况下不难超过 16MB(854x480,32 位位图大约1.6MB 未压缩。)

在我的游戏中,我能够通过仅加载我将在当前关卡中使用的位图来绕过它(例如,我有一个背景的单个位图对象,每次更改时都会从资源中重新加载,而不是在内存中维护多个位图。我只维护一个 int 来跟踪我当前加载的资源。)

您的 sprite 表很大,所以我认为您需要减小动画的大小是对的。或者,从资源加载相当快,因此您可以做一些事情,例如只加载角色当前方向的动画条,并在他转身时让他稍作停顿,同时用新的动画条替换它。不过,这可能会变得复杂。

此外,我强烈建议您在模拟器上测试您的应用程序,并将 VM 堆设置为 16mb,以确保您已解决所有设备的问题。 (模拟器通常默认为 24​​mb,因此很容易未经测试并在发布后生成一些 1 星评论。)

关于java - 游戏开发时位图大小超过VM预算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9959384/

相关文章:

python - 合并多个大型 DataFrame 的有效方法

java - 读取 Android Spring 拦截器中的响应主体

Python:内存问题:基于标准的组合

java - Eclipse 渲染问题

java - 使用 Lucene 将整个数据库索引到单个文档中

android - Google Play 在上传新版本时拒绝了应用

java - 如何将 Vector 放入 intent.extra?

java - FileWriter 内存不足

java - 在 MapReduce 中,如何将数组列表作为值从映射器发送到 reducer

java - 使用 Saxon 进行转换时处理 XML 中的特殊字符