我有一大堆超过一千个16乘16像素的瓷砖图像,这些都是我用Java制作的游戏所需要的。
在不耗尽JVM可用内存的情况下存储磁贴的最佳方法是什么?
我认为产生1000+ BufferedImages可能并不明智......
保持图像准备就绪的主要目的是加载地图,这些地图将根据地图文件动态生成。
答案 0 :(得分:6)
首先,加载所有这些图像确实是一个问题。 16乘16像素的1000个图像是256000个像素。即使每个像素使用4个字节也只会导致1 MB的图像数据,这并不多。
如果您真的想要/需要减少加载到内存中的图像数量,您只能将地图所需的可视图块/图像加载到内存中,还可以增加一些图像以提高游戏的响应速度。
例如,如果您的游戏显示n
m
个贴图的地图,您可以将n+2
m+2
个贴图加载到内存中,或者直观地显示(其中*是可见的瓷砖和额外加载的瓷砖到内存中):
+++++++++++
+*********+
+*********+
+*********+
+++++++++++
当用户移动地图时,您将删除对不再需要的切片的引用,并开始加载新切片。由于您在内存中保留了一个磁贴,因此移动地图仍应非常顺利。当然,如果您的瓷砖相当小,或者移动地图的速度非常快,您可以增加使用的额外瓷砖数量
答案 1 :(得分:1)
答案 2 :(得分:0)
我不认为缓存1000+图像是最佳选择,因为它会消耗大量内存。也许最好是实现不同的逻辑,比如缓冲区,大多数使用的图像只有100左右(只需使用随机数,但你需要计算经常使用的图像数量),如果有任何图像比这些缓存,请在需要时加载它们