我正在编写一个简单的游戏,并希望通过Java Graphics + Swing API进行显示。当然,它感觉有点慢,所以我测量了重绘的时间,大约是32ms。然后我读了关于加速Java图形,并使用这里描述的方法:Space InvadersJava图形性能
然而,不知何故,这甚至更慢。现在需要大约98ms才能重绘。这是为什么?
请注意,我知道像LWGL和JOGL这样的库,但我不想为这种图形化简单的游戏使用完整的OpenGL包装。
我正在编写一个简单的游戏,并希望通过Java Graphics + Swing API进行显示。当然,它感觉有点慢,所以我测量了重绘的时间,大约是32ms。然后我读了关于加速Java图形,并使用这里描述的方法:Space InvadersJava图形性能
然而,不知何故,这甚至更慢。现在需要大约98ms才能重绘。这是为什么?
请注意,我知道像LWGL和JOGL这样的库,但我不想为这种图形化简单的游戏使用完整的OpenGL包装。
我下载了你的图书馆(Bonsai)。但我有一个问题:你创建了一个'GameEngine'类。这里有什么用途(谷歌翻译)? – 2010-01-05 17:40:40
其实我的Eclipse SVN插件有问题,所以它没有远程删除文件。就在今天,我通过另一个SVN客户端删除了这个文件,这个客户端崩溃了整个eclipse项目,所以我不得不重建它,然后再次以某种方式销毁该存储库:D因此,该文件仅仅是一个开发的遗留问题,在某个时候我想从applet/gui中分解出实际的引擎。 – 2010-01-05 21:51:03
感谢(15个字符) – 2010-01-06 13:04:28
你可以看看processing。
我同意尼古拉斯,图形/交互处理是伟大的
尝试JGame。这是2D游戏的简单引擎,它在使用GL时可以使用GL,并且可以制作从手机到台式机系统的任何游戏。
首先,你应该检查,看看有多少时间花在你自己的代码中,花费在实际绘制框架上的时间。您可能有一些错误或故障,使其运行速度更慢。
你应该能够得到好得多的表现,然后98ms来绘制你的屏幕。这些游戏库可能会使用相同的图形调用。但是,您使用的容器可能会对绘制速度有很大影响。我记得几个月前在研究一些双缓冲图形代码,并且如何创建后台缓冲区在性能方面做出了巨大的改变。
特别是,确保您只能在之后创建背景图片,或者至少只在您的画布调整大小时创建背景图片。在我的画的代码我这样做:
//create a graphics backplane
if(backplane == null || !backplaneSize.equals(this.getSize())){
backplane = this.createImage((int)this.getSize().getWidth(), (int)this.getSize().getHeight());
backplaneSize = this.getSize();
}
所以背板仅被创建,如果它是新的,或者如果组件大小。这对巨大的影响速度。
自从JDK 1.0开始,我一直在java中进行图形编程。其实我从来没有听说过这个BufferStrategy的东西。嘿。
我从来没有得到基本的Java图形调用良好的帧速率任何麻烦。另一件需要注意的事情是确保Swing不会试图为您清除组件背景。这可能是经济放缓的另一个原因。
一些提示,以提高性能:
Swing是不是天生就慢。关于Swing的大部分困惑来自不了解或不了解事件调度线程的人(是的,这需要付出很多努力才能做到)。
关于你的时候,你只是调用时间设置之间g.drawImage?如果是这样,你正在重新绘制多大的尺寸,并且你是否正在调用这个调用?
编辑:忘了提及Pulp Core - 一个非常好的Java游戏框架。
Java2D的表现是一种黑暗艺术。它可以在不同的平台上有所不同,但可以让它表现良好。
有时做看似无关痛痒的事情可能会导致更慢的性能。你想确保你是using accelerated images as much as possible。
图像的type也可以显著。我不知道全部细节,但是我知道我的程序比类型5(3BYTE BGR)等类型1图像(INT RGB)要快得多,因为转换问题。
我无法确切地知道你在做什么。你的问题是关于Swing,但你提到了一个Canvas和Bufferstrategy。在Swing中,你会使用一个自动双缓冲的JPanel,所以你不必担心这个。
我测试了1000个移动球的简单动画。定时器设置为每100ms触发一次。当计时器开火时,随机移动到新位置的1000个球和一个新的BufferedImage被创建,并且显示图像的面板被重新绘制。重新绘制的时间差为110毫秒,这意味着它只需要10毫秒来创建一个新的BufferedImage并进行绘画。这幅画是全屏完成的,所以没有剪裁完成。
这posting显示我所测试的示例代码。
如果您想要快速测量时间,最好的方法是使用System.nanoTime()(在JDK 1.5中添加),其度量单位为纳秒。它长期不如System.currentTimeMillis准确,但在短期内显然更有效。 – 2009-12-12 18:51:16
你可以发表一些你的绘画代码吗?和时钟/定时器逻辑? – basszero 2009-12-12 13:41:01
时钟/定时器逻辑就是通过System.currentTimeMillis()获得的两个长值的差别。我知道测量这种时间并不是一个好方法,但我只是粗略估计它需要多长时间。绘画代码只是在画布上绘制静态图像。所以它只是g.drawImage(img,0,0,null),其中g是通过BufferStrategy变量获得的。 – 2009-12-12 13:48:50