Java 从内存中快速卸载位图
我正在用Java创建这个Android游戏。我有相当多的图像,但不需要同时使用它们,所以我创建了一个资源管理器类,它负责处理正在使用的位图。但是,我发现从内存中清除位图的速度非常慢。我目前正在做这样的事情:Java 从内存中快速卸载位图,java,android,bitmap,Java,Android,Bitmap,我正在用Java创建这个Android游戏。我有相当多的图像,但不需要同时使用它们,所以我创建了一个资源管理器类,它负责处理正在使用的位图。但是,我发现从内存中清除位图的速度非常慢。我目前正在做这样的事情: bitmap.recycle() bitmap = null System.gc (also tried Runtime.getRuntime().gc()) 首先,是否有任何方法可以更快地从内存中卸载位图,或者是否有可能以某种方式检查位图是否确实被清除,以便我可以使加载屏幕也依赖于此?
bitmap.recycle()
bitmap = null
System.gc (also tried Runtime.getRuntime().gc())
首先,是否有任何方法可以更快地从内存中卸载位图,或者是否有可能以某种方式检查位图是否确实被清除,以便我可以使加载屏幕也依赖于此?正如SylvainL所说,System.gc和friends收集完整的垃圾,速度可能相当慢。Java机器定期运行GC,并且根据给定时刻可用的可用内存量对周期进行微调 对我来说,最好的选择是使用某种位图池:拥有一组可以从池中获取并释放到池中的预制位图实例,并应用LRU策略在缓存中管理缓冲区实例
通过适当的微调,您可以在创建和销毁位图实例时获得零成本,并且包含位图数据的缓冲区实例将根据使用情况动态加载到内存中或从内存中卸载。无法保证在尝试as gc()时垃圾回收器将实际运行需要某些先决条件,如资源匮乏。很明显,调用gc()只会浪费关键的CPU周期。作为一名开发人员,我们可以通过取消引用来收集gc中不必要的对象 在创建游戏系统(game)时,有两种优化技术可能会有所帮助
希望这会对你有所帮助。你可以考虑使用现有的位图缓存引擎,而不是滚动你自己的:原因是它慢了你正在调用GC。需要时让它运行+1@commonware不需要重新设计wheel.calling.recycle()并将其设置为null,实际上就可以做到这一点。无需调用.gc():)@RasmusAppelkvist-如果JVM即将耗尽内存,它将主动运行垃圾收集。您的职责以确保对象可以被垃圾收集而告终;这将是一个缓慢的操作,即使没有收集。把它留给安卓系统通常是个更好的主意;这可能会选择频率和最重要的GC类型,比每次释放位图时调用完整GC要好得多。