我有一大批16x16像素的图块图片,需要用于我正在开发的Java游戏。
如何在不耗尽JVM内存的情况下存储这些图块呢?
我想,生成1000多个BufferedImage可能不是最明智的选择...
保持这些图像准备就绪的主要目的是为了加载地图,这将根据地图文件动态生成。
我有一大批16x16像素的图块图片,需要用于我正在开发的Java游戏。
如何在不耗尽JVM内存的情况下存储这些图块呢?
我想,生成1000多个BufferedImage可能不是最明智的选择...
保持这些图像准备就绪的主要目的是为了加载地图,这将根据地图文件动态生成。
首先,加载所有这些图像真的是一个问题吗?1000张16×16像素的图片总共只有256000个像素。即使为每个像素使用4个字节,也只会产生1MB的图像数据,这并不多。
如果你真的想/需要减少加载到内存中的图像数量,你可以只将地图所需的视觉瓷砖/图像加载到内存中,再加载几个以增加游戏的响应性。
例如,如果你的游戏显示一个 n
乘以 m
的地图,你可以加载一个 n+2
乘以 m+2
的地图瓦片/图像到内存中进行表示(其中 * 是可见瓷砖/图像,+ 是额外加载到内存中的瓷砖/图像):
+++++++++++
+*********+
+*********+
+*********+
+++++++++++
你试过了吗?如果每个像素有4个字节,16 x 16 x 4 x 1000大约是1Mb +开销。这已经不算太多了。如果你负担不起,那么也许可以创建更大的图像,加载它们,然后按需提取瓦片。
我认为缓存1000多张图片不是最好的选择,因为它会消耗大量内存。也许更好的做法是实现不同的逻辑,例如仅缓存最常用的100张左右的图片(只是随机选取了一个数字,但你需要确定有多少频繁使用的图片),如果超出这些缓存的图片,则在需要时加载它们。