用awt在Java中使用sprite表有什么好处吗?

时间:2014-07-01 00:34:21

标签: java image performance awt sprite-sheet

我知道this question解决了flash的问题,而this question对于像OpenGL这样的杂项渲染引擎来说,模糊地解决了这个问题。后者通过声明调整图像的UV比在全新图像中加载更容易来确定精灵表的优越性。

我目前从图像加载精灵的方式如下所示

BufferedImage spriteSheet = ImageIO.read(new File("res/sprite.png"));
Image desiredImage = spriteSheet.getSubimage(0, 0, 16, 16);

这不会调整spriteSheet的紫外线,它会创建图像所需部分的副本,这似乎会占用更多内存。

有没有更好的方法来使用精灵?在这种情况下使用精灵或单独加载图像是否更有效?

1 个答案:

答案 0 :(得分:1)

与普遍看法相反,BufferedImage.getSubimage(...) 不会创建新的图像数据副本。它只是父母的一个(现场)视图。图片。与实际克隆数据阵列相比,这非常快速且便宜。因此,我认为以这种方式使用精灵表非常有意义。

对父图像所做的任何更改都将反映在子图像中,反之亦然。来自javadoc:

  

返回由指定矩形区域定义的子图像。返回的BufferedImage与原始映像共享相同的数据数组。

换句话说,只为每个子图像实例创建了一个围绕数据数组的小包装器。验证这一点的最简单方法是尝试绘制其中一个子图像并查看反映的变化。

正如@MadProgrammer指出的那样,加载一个大图像可能比加载许多小图像更快,内存效率更高。

但是,有一些问题:

  • 较大的图像需要更大的连续内存块。这可能是已运行一段时间的Java VM中的一个问题,因为可用内存变得支离破碎(在现代虚拟机中可能不是问题,如果你在游戏早期加载一次图像就没有问题) 。
  • 创建子图像后,在释放子图像(由于共享数据阵列)之前,无法释放父图像的内存。如果这不是您想要的,则需要手动创建子图像的副本。