我知道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
的紫外线,它会创建图像所需部分的副本,这似乎会占用更多内存。
有没有更好的方法来使用精灵?在这种情况下使用精灵或单独加载图像是否更有效?
答案 0 :(得分:1)
与普遍看法相反,BufferedImage.getSubimage(...)
不会创建新的图像数据副本。它只是父母的一个(现场)视图。图片。与实际克隆数据阵列相比,这非常快速且便宜。因此,我认为以这种方式使用精灵表非常有意义。
对父图像所做的任何更改都将反映在子图像中,反之亦然。来自javadoc:
返回由指定矩形区域定义的子图像。返回的BufferedImage与原始映像共享相同的数据数组。
换句话说,只为每个子图像实例创建了一个围绕数据数组的小包装器。验证这一点的最简单方法是尝试绘制其中一个子图像并查看反映的变化。
正如@MadProgrammer指出的那样,加载一个大图像可能比加载许多小图像更快,内存效率更高。
但是,有一些问题: