从内存中快速卸载位图

时间:2012-12-19 23:44:21

标签: java android bitmap

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

bitmap.recycle()
bitmap = null

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

首先,有没有办法更快地从内存中卸载位图,或者是否有可能以某种方式检查它们是否实际被清除,以便我可以使加载屏幕也依赖于它?

2 个答案:

答案 0 :(得分:1)

当我们尝试System.gc()时,无法保证垃圾收集器实际运行,因为gc()需要某些先决条件,比如资源饥饿。所以很明显,调用gc()只是浪费了关键的CPU周期。作为开发人员,我们可以通过使引用无效来为gc collectable创建不必要的对象。

在创建游戏系统(游戏)时,有几种优化技术可以提供帮助。

  1. 使用纹理。这是example

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

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

  4. 始终针对内存泄漏问题测试您的应用。这是一个有用的nice post

  5. 在同一场景中保持游戏内多次使用的InMemory(不释放一次)项目。原因是将图像加载到内存中需要花费大量时间。

  6. 希望这会对你有所帮助。

答案 1 :(得分:0)

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

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

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