快速从内存卸载位图



我正在Java创建此Android游戏。我有很多图像,但不需要一次使用它们,因此我创建了一个资源管理类,该类负责正在使用的位图。但是,我发现将位图从内存中清除得非常慢。我目前正在做这样的事情:

bitmap.recycle()
bitmap = null
System.gc (also tried Runtime.getRuntime().gc())

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

不能保证当我们尝试使用system.gc()时,垃圾收集器实际上会运行,因为GC()期望某些先决条件(例如资源饥饿)。因此,很明显,呼叫GC()只是在浪费关键的CPU周期。作为开发人员,我们可以通过废除参考文献来制作不必要的对象。

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

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

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

  3. 使用这些标准的Android DOC来有效地加载大型位图和缓存位图,以更好地使用位图。这个想法是,当用户设备效率不足以处理游戏的处理量和/或游戏中的内存量较少时,您始终可以缩小位图(以质量妥协以获得更好的响应)。

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

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

希望这对您有帮助。

正如Sylvainl所说,System.gc和朋友收集了完整的垃圾,可能会很慢。Java机器定期运行GC,并且根据给定时刻可用的免费内存进行填充。

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

通过适当的填充,您可以在汇总时创建和破坏位图实例时获得零成本,并且根据用法的不同,包含位图数据的缓冲区实例将被动态加载到并从内存中卸载。

最新更新