【发布时间】:2014-08-21 11:03:13
【问题描述】:
我知道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 的 UV,它会创建图像所需部分的副本,这似乎会占用更多内存。
有没有更好的方式来使用精灵?在这种情况下,使用精灵还是单独加载图像更有效?
【问题讨论】:
-
“会占用更多内存。” - 加载单独的精灵可能会在短期内使用更多内存,因为图像会被解码并转换为内部Java 使用的图像对象的表示。通常,以这种方式进行子映像会更快,并且可能会产生较小的内存负载(而不是读取每个文件),因为图像已经在 Java 使用的内存模型中,但是是的,它会创建一个新的副本父图像的部分。真正的答案将取决于您打算将其用于什么。如果它是短暂的,这可能是可取的
-
子图像也更快,但仍将归结为图像的使用方式。
-
@MadProgrammer 我通过使用
paintComponent(Graphics g)调用g.drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)将它们绘制到JPanel。 -
我更多地考虑精灵可能会在内存中保留多长时间
-
@MadProgrammer 一般来说,他们是在组织图像组,而不是单个动画。
标签: java image performance awt sprite-sheet