【问题标题】:Optimizing performance by removing duplicate BufferedImages / Fast way to compare BufferedImages in Java通过删除重复的 BufferedImages 优化性能/在 Java 中比较 BufferedImages 的快速方法
【发布时间】:2014-08-12 13:42:29
【问题描述】:

我正在开发一个 Java 应用程序,在该应用程序中,我在程序上实例化一个可能大量的对象实例,每个实例都有一个图标(一个 BufferedImage),该图标是从一组(基于随机参数)中选择的10 或 20 个 32x32 PNG。

为了优化性能,我想到将图像加载到静态 ArrayList 中,而不是将它们存储为参数。然后,当我实例化一个对象时,我检查 ArrayList 是否包含对象图标。如果没有,它会加载它,但如果是,它只是保存图像的索引并在需要时查找它。这在小范围内可能会慢一点,但会限制一点内存使用,因为对象的数量变得远远大于图标的可能数量。

考虑到图像的大小和我可能拥有的数量,我认为这种实现方式不会对性能产生太大影响,但存储所有这些重复的 BufferedImages 感觉很糟糕,而且它是表演中有趣的驱魔。

我的问题是,首先,这有必要吗?有没有更好的方法来做到这一点?还是 Java 虚拟机 / 缓存 / 其他一些进程为我做这些工作?

在那之后,比较 BufferedImages 的最快方法是什么? 这个问题已经在其他几个地方问过,但我从未见过一个很好的答案。幼稚的方法是一次比较图像数据的每个像素,但这似乎不必要地缓慢。我考虑过使用抗碰撞哈希函数,但由于大多数标准哈希函数都是为密码学设计的,因此它们不必要地复杂并且故意非常慢。到目前为止,我对此的最佳想法似乎是创建一个自定义图像类,扩展 BufferedImage,它有一个图像的 src/url 字段,然后在每次加载图像时设置它,并以此为基础进行比较。

【问题讨论】:

    标签: java image performance optimization bufferedimage


    【解决方案1】:

    到目前为止,我对此的最佳想法似乎就是创建一个 自定义图像类,扩展 BufferedImage,它有一个字段 图片的 src/url ,然后每次设置图片 加载,并以此为基础进行比较。

    如果这对您的用例有效,即如果图像和 URL 之间存在一对一的映射,只需创建一个映射,其中 URL 字符串作为键,图像作为值:

    Map<String, BufferedImage> images = new HashMap<>();
    

    然后您可以轻松地根据 URL 从地图中检索:

    BufferedImage image = images.get("whatever");
    

    或者,您可以使用像Guava's 这样的缓存实现。

    【讨论】:

    • 谢谢,这看起来对我来说是正确的方法。我以前从未使用过 HashMaps,所以我什至没有考虑它,但这似乎是显而易见的选择。我将在报告进展情况时实施。
    猜你喜欢
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多