我正在制作一款需要在循环中加载图像(用于动画和其他内容)的游戏,所以我使用了以下内容:
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
的函数慢?
首先,你说你的游戏
需要在其循环中加载图像
我不明白这个,我不认为我同意这个前提。如果时间和性能至关重要,I/O应该总是将卸载到单独的线程。
也就是说,从URL中读取比从文件中读取需要更多的通用代码。它需要处理从离线服务器、本地文件系统上的文件下载,甚至从JAR解压缩资源。最后一个是你所经历的。
我建议重写应用程序,让而不是读取paint loop中的图像,但是如果你很懒,你也可以将资源解包到临时文件夹(预先),然后像以前一样从文件中读取。 ImageIO.setUseCache(false)
在读取映像时使用内存缓存而不是磁盘缓存,也可能有助于使事情更快一些。特别是在从JAR资源加载时。