9

我正在用 Java 创建这个 Android 游戏。我有很多图像,但不需要一次全部使用它们,所以我创建了一个资源管理器类来处理正在使用的位图。但是,我发现从内存中清除位图非常慢。我目前正在做这样的事情:

bitmap.recycle()
bitmap = null

System.gc (also tried Runtime.getRuntime().gc())

首先,有什么方法可以更快地从内存中卸载位图,或者是否有可能以某种方式检查它们是否真的被清除了,这样我就可以让加载屏幕也依赖于此?

4

2 回答 2

1

当我们尝试System.gc()时,不能保证垃圾收集器会真正运行,因为 gc() 需要某些先决条件,例如资源饥饿。所以很明显,调用 gc() 只是在浪费关键的 CPU 周期。作为开发人员,我们可以通过取消引用来为 gc 收集不必要的对象。

在创建游戏系统(游戏)时,有几种优化技术可能会有所帮助。

  1. 使用纹理。这是一个例子

  2. 使用 Sprite 和 SpriteSheets(与加载单个位图相比,它给系统带来的开销更少)。许多开源游戏引擎都在使用它。如果您不想使用它们,请了解如何从这些来源从头开始创建。

  3. 使用这些标准的 android 文档来了解如何有效地加载大型位图缓存位图以更好地使用位图。这个想法是当用户设备的效率不足以处理处理量和/或游戏的内存较少时,您总是可以缩小位图(为了更好的响应而牺牲质量)。

  4. 始终针对内存泄漏问题测试您的应用程序。这是一个很好的帖子,会有所帮助。

  5. 将在游戏内多次使用的物品保留在内存中(使用过一次不释放)。原因是将图像加载到内存中需要大量时间。

希望这会帮助你。

于 2012-12-21T06:48:26.720 回答
0

正如 SylvainL 所说,System.gc 和朋友会收集完整的垃圾并且可能会很慢。Java 机器定期运行 GC,并且根据给定时刻可用内存的多少来微调周期。

对我来说最好的选择是使用某种位图池:拥有一组可以从池中获取和释放到池中的预制位图实例,并在应用 LRU 策略的缓存中管理 Buffer 实例。

通过适当的微调,您可以在池中创建和销毁 Bitmap 实例时获得零成本,并且包含位图数据的 Buffer 实例将根据使用情况动态加载到内存中或从内存中卸载。

于 2012-12-21T01:20:27.183 回答