ImageIO.read(url x) 比 ImageIO.read(文件 f) 慢

ImageIO.read(url x) slow compared to ImageIO.read(file f)

我正在制作一个需要在其循环中加载图像的游戏(用于动画和其他东西),所以我使用了这个:

 url = getClass().getResource("/pic/image.gif");
 pic = ImageIO.read(new File(url.getPath()));

在 运行 在 IDE (netbeans) 上玩游戏时完美运行,但是当我 运行 它在构建项目后形成 .jar 文件时它不起作用.阅读 API 文档,我看到 ImageIO.read() 函数有几个重载实现,其中一个使用 url 作为参数,我认为它可以帮助我解决我的问题,事实上,它做到了。

 pic = ImageIO.read( getClass().getResource("/pic/image.gif") );

问题是这样加载图像似乎花费的时间太长,导致游戏变慢(不多,但很明显)。所以问题是:为什么使用 url 作为参数的函数比接收 file 的函数慢?

首先:你说你的游戏

needs to load images inside its loop

我不明白这个,我不认为我同意这个前提。 如果时间和性能至关重要,I/O 应该 总是 卸载到单独的线程。


也就是说,从 URL 中读取比从文件中读取需要更通用的代码。它需要处理从异地服务器下载、本地文件系统上的文件,甚至从 JAR 解压缩资源。最后一个是你的经历。

我建议将应用程序重写为 在绘画循环中读取图像,但如果你懒惰,你也可以将资源解压缩到一个临时文件夹(预先) 并像以前一样从文件中读取。

ImageIO.setUseCache(false) 也可能有助于加快速度,方法是在读取图像时使用内存缓存而不是磁盘缓存。特别是从 JAR 资源加载时。