【发布时间】: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