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

时间:2011-12-29 19:38:50

标签: java performance image caching storage

我有一大堆超过一千个16乘16像素的瓷砖图像,这些都是我用Java制作的游戏所需要的。

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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