我在做一个游戏而已载各位图在开始由于在建造游戏的编辑器的用户可以把任何的精灵入水平。还级使用各种各样的精灵,没有任何系统,该系统将允许负载的团体的精灵的动态对各个级别。

一段时间后,现在已经有250+png图像在游戏中与总尺寸3.5MB。

游戏载荷大多数的精灵(约200个)使用BitmapFactory.decodeStream没有任何选项的设定,也有大约50个其他其中引用xml布局的活动。

当我试各种设备、游戏有时候跑出来的记忆,但是我不能找到一个模式以及甚至决定通过我有多需要,例如降低大小的图片或其数量。

手机在我的发展,宏达的愿望与安卓2.2 24MB VM堆大小不行OOM.

戴尔纹与安卓2.2和40MB VM堆大小不行OOM,太。

摩托罗拉的里程碑,安卓2.1和24MB VM堆大小的成功负荷所有的精灵,但呛在最后几个图像用于图片视图的时候开始的活动之一(开菜单)。如果我评论的几个这样的ImageViews出,它加载确定的,但可能窒息等其他活动之后。它也不稳定,可能是因为碎片发生不同的方式在不同的启动。

宏达的英雄2.2的我的朋友(不知道堆大小,它是16MB?) 崩溃。

什么是最令人困惑的是,摩托罗拉24MB,同样作为宏达的愿望。2.1执行存管理效率较低?(例如导致更多碎片的?) 或是存管理更糟的是所有摩托罗拉的电话?那为什么宏达的英雄2.2崩溃?什么是更大在宏达的愿望一个英雄吗?

看起来像OOM发生在旧的手机,但这是唯一的事情我已经想通了这么远。

如果OOM只发生在旧的手机是说,5%的市场,我可以仅仅排除2.1或一个更具体的支持设备的通过只是收集崩溃报告并不包括所有的崩溃,从列表的支持。否则我现在需要扩大下来我所有的图像通过一些恒的因素(例如1.6),这将意味着调整所有45个水平了天的设计和测试,重新定位GUI元素等。甚至在那之后,我仍然不能肯定,在其设备的减少总量的大小的位图通过一个因素,例如:2就足以避免OOMs.

任何建议呢?我应该设置任何特定选项BitmapFactory?顺便说一句,大多数图像具有透明bg素,正如我了解,不允许让他们在565格式。

我花了2天的浏览这里和在其他地方,但是我仍然在损失。

谢谢你。

有帮助吗?

解决方案

我不得不处理您的问题的简单版本 - 我们彼此之间有3个2MPIX层,毫不奇怪,有时会导致OOM。

就我而言,我没有在彼此之间使用3个图像视图,而是始终将所有6个MPIX保存在内存中,而是手动将图层混合在一起,因此在任何时候最多可以保持4个MPIX(在内存中最多保持4个MPIX(只有2个MPIX处的2 mpix”休息” - 我们的应用程序中的层发生了变化)。

这是一个经典的时空权衡 - 牺牲效率(时间)以获得记忆(空间)。有点慢,因为你必须 recycle() 完成后的每个位图以确保记忆被释放。

至于不一致的OOM,这可能与垃圾收集有关。您可以假设垃圾收集器是非确定性的,因此任何记忆压力也变得无确定性(取决于GC上次启动的时间)。

简短的摘要是,您必须非常非常小心的记忆使用情况,并且没有办法。 *

* 从理论上讲,您可以使用NDK并直接从操作系统分配Dalvik堆之外分配内存。这是一个巨大的骇客,达尔维克和您的分配器之间的桥梁会很丑陋。

其他提示

首先你需要找到到底是什么使用所有的存储器。 看看这个。 也许你可以回收的位图,为实例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top