【发布时间】:2012-03-20 19:36:55
【问题描述】:
我正在使用 Java2D 库和 BufferedImage 类将游戏编写为 Java 小程序。第一次绘制图像时游戏会卡顿(2-3 秒)。 BufferImage文件都是在游戏开始前加载的,使用这个方法:
bufferedImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
try {
URL url = new URL(a.getCodeBase(), "images//smoke5frames.png");
bufferedImage = ImageIO.read(url);
} catch (IOException e) { e.printStackTrace(); }
mSmoke = bufferedImage;
要绘制图像,我使用的是这种方法:
public void draw(Graphics2D g) {
g.drawImage(mTextures[iCurrentFrame], mAffineTransform, null); }
有问题的图像是 SheetedSprites,通常使用以下方法从精灵表中剪切:
for each frame in animation...
myBufferedImage.getSubimage(i * iFrameWidth, 0, iFrameWidth, iHeight);
这是在游戏过程中创建实体时完成的。删除这条线并没有解决问题,所以我假设(可能很糟糕) getSubimage() 的成本不足以导致问题。
我可以循环播放动画的每一帧并将它们全部绘制出来以便快速修复,但我想更多地了解这个问题以及它发生的原因。
关键是一旦SheetedSprite 被绘制了一次,您就可以刷新页面并且问题不会再次出现。一切都画好之后,游戏运行非常流畅。 IE 和 Chrome 都是这种情况(我没有在任何其他浏览器上尝试过)。附带说明一下,Eclipse 的 Applet 查看器中永远不会出现此问题。
我最好的猜测是浏览器以某种方式缓存了图像,尽管我真的很难过。我也没有尝试使用一组不同的图形库(Slick2D、LWJGL 等)加载/绘制图像。感谢您的任何建议!
【问题讨论】:
-
draw(G2D)从哪里调用&图形对象是如何获得的?实际上不,不考虑那个确切的问题,以SSCCE 的形式提供答案。 -
这是一个展示用于绘制图像的方法的项目的 zip:dan.nemmons.net/stack/UnprofStackQuestion.zip 在 Applet 子类中,我创建了一个具有屏幕尺寸的 Image 对象。我通过 image.getGraphics() 获得了这个 Image 的 Graphics 成员。每次绘制调用,我都会清除图形,并将它们传递给将 Graphics 对象转换为 Graphics2D 的游戏。游戏从这里对所有精灵调用 sprite.draw(graphics2d)。最后,在 Applet 的 draw 方法结束时,我将 Image 绘制到屏幕上。
-
您能否将代码写得足够短,使其成为可以作为编辑发布的 SSCCE?这就是我要研究的内容。
标签: java applet bufferedimage java-2d