Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从内存中快速卸载位图_Java_Android_Bitmap - Fatal编程技术网

Java 从内存中快速卸载位图

Java 从内存中快速卸载位图,java,android,bitmap,Java,Android,Bitmap,我正在用Java创建这个Android游戏。我有相当多的图像,但不需要同时使用它们,所以我创建了一个资源管理器类,它负责处理正在使用的位图。但是,我发现从内存中清除位图的速度非常慢。我目前正在做这样的事情: bitmap.recycle() bitmap = null System.gc (also tried Runtime.getRuntime().gc()) 首先,是否有任何方法可以更快地从内存中卸载位图,或者是否有可能以某种方式检查位图是否确实被清除,以便我可以使加载屏幕也依赖于此?

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

bitmap.recycle()
bitmap = null

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

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

正如SylvainL所说,System.gc和friends收集完整的垃圾,速度可能相当慢。Java机器定期运行GC,并且根据给定时刻可用的可用内存量对周期进行微调

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


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

无法保证在尝试as gc()时垃圾回收器将实际运行需要某些先决条件,如资源匮乏。很明显,调用gc()只会浪费关键的CPU周期。作为一名开发人员,我们可以通过取消引用来收集gc中不必要的对象

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

  • 使用纹理。这是一个例子

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

  • 使用这些标准android文档了解如何 为了更好地使用位图。其想法是,当用户设备的效率不足以处理游戏的处理量和/或内存不足时,您可以始终缩小位图的比例(在质量上妥协以获得更好的响应)

  • 始终针对内存泄漏问题测试应用程序。这是一个有用的方法

  • 将在同一场景中游戏中多次使用的物品保留在内存中(使用后不要释放)。原因是将图像加载到内存中需要很多时间


  • 希望这会对你有所帮助。

    你可以考虑使用现有的位图缓存引擎,而不是滚动你自己的:原因是它慢了你正在调用GC。需要时让它运行+1@commonware不需要重新设计wheel.calling.recycle()并将其设置为null,实际上就可以做到这一点。无需调用.gc():)@RasmusAppelkvist-如果JVM即将耗尽内存,它将主动运行垃圾收集。您的职责以确保对象可以被垃圾收集而告终;这将是一个缓慢的操作,即使没有收集。把它留给安卓系统通常是个更好的主意;这可能会选择频率和最重要的GC类型,比每次释放位图时调用完整GC要好得多。