java - 通过删除重复的 BufferedImages/在 Java 中比较 BufferedImages 的快速方法来优化性能

标签 java image performance optimization bufferedimage

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

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

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

我的问题是,首先,这有必要吗?有更好的方法吗?或者 Java 虚拟机/缓存/其他进程是否为我完成了一些工作?

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

最佳答案

The best idea I've had for this so far seems to be to just create a custom image class, extending BufferedImage, which has a field for the src/url of the image, and then just set that every time an image is loaded, and compare based off that.

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

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

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

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

或者,您可以使用缓存实现,如 Guava的。

关于java - 通过删除重复的 BufferedImages/在 Java 中比较 BufferedImages 的快速方法来优化性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25256861/

相关文章:

JavaFX2 WebView 和内存中图像

html - 使用 CSS 缩放图像同时保持圆 Angular

mysql - 在 MySQL 中通过复杂表达式获取 N 行顺序的有效方法

performance - 索引大小对搜索速度的影响(存储或不存储)

php - Android通过从sd卡或文件管理器中随机选择图像上传到PHP服务器

python - 使用 numpy magic 避免三重嵌套 for 循环

java - 我不知道为什么我的按钮列表顶部有一个“确定”按钮

java - 使用 jenkins cli、jdk 8.144、jenkins v2.93 时获取 Java IO 异常

java - 高效计数器 float 错误

java - 如何进行 "swipe information" Activity ?