在Java中加载和缓存图像的最佳方法是什么?

我有一个超过一千个16乘16像素平铺图像的大集合,我将用于Java制作的游戏。

在不耗尽JVM可用内存的情况下存储磁贴的最佳方法是什么?

我认为产生1000+ BufferedImages可能并不明智……

保持图像准备就绪的主要目的是加载地图,这些地图将根据地图文件动态生成。

首先,加载所有这些图像真的是一个问题。 16乘16像素的1000个图像是256000个像素。 即使每个像素使用4个字节也只会导致1 MB的图像数据,这并不多。

如果您真的想/需要减少加载到内存中的图像数量,您只能将地图所需的可视图块/图像加载到内存中,还可以增加一些图像以提高游戏的响应速度。

例如,如果你的游戏显示的是一个nm的地图,你可以将n+2m+2拼贴加载到内存中,或者直观地表示(其中*是可见的拼贴和+额外加载的拼贴到内存中):

 +++++++++++ +*********+ +*********+ +*********+ +++++++++++ 

当用户移动地图时,您将删除对不再需要的切片的引用,并开始加载新切片。 由于您在内存中保留了一个磁贴,因此移动地图仍应非常顺利。 当然,如果你的瓷砖相当小,或者移动地图的速度非常快,你可以增加你使用的额外瓷砖的数量

你有没有尝试过? 如果每个像素有4个字节,则16 x 16 x 4 x 1000约为1Mb +开销。 那不是那么多了。 如果你负担不起,那么可能会创建更大的图像,加载它们然后根据需要提取出来。

我不认为缓冲1000+图像是最佳选择,因为它消耗大量内存。 也许最好是实现不同的逻辑,比如缓冲区,只使用最常用的图像,如100左右(只需使用随机数,但需要计算频繁使用的图像数量),如果有任何图像比这些图像缓存,则在需要时加载它们。