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

4

我有一大批16x16像素的图块图片,需要用于我正在开发的Java游戏。

如何在不耗尽JVM内存的情况下存储这些图块呢?

我想,生成1000多个BufferedImage可能不是最明智的选择...

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

3个回答

6

首先,加载所有这些图像真的是一个问题吗?1000张16×16像素的图片总共只有256000个像素。即使为每个像素使用4个字节,也只会产生1MB的图像数据,这并不多。

如果你真的想/需要减少加载到内存中的图像数量,你可以只将地图所需的视觉瓷砖/图像加载到内存中,再加载几个以增加游戏的响应性。

例如,如果你的游戏显示一个 n 乘以 m 的地图,你可以加载一个 n+2 乘以 m+2 的地图瓦片/图像到内存中进行表示(其中 * 是可见瓷砖/图像,+ 是额外加载到内存中的瓷砖/图像):

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

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

1

你试过了吗?如果每个像素有4个字节,16 x 16 x 4 x 1000大约是1Mb +开销。这已经不算太多了。如果你负担不起,那么也许可以创建更大的图像,加载它们,然后按需提取瓦片。


0

我认为缓存1000多张图片不是最好的选择,因为它会消耗大量内存。也许更好的做法是实现不同的逻辑,例如仅缓存最常用的100张左右的图片(只是随机选取了一个数字,但你需要确定有多少频繁使用的图片),如果超出这些缓存的图片,则在需要时加载它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接