2009-12-12 68 views
6

我正在编写一个简单的游戏,并希望通过Java Graphics + Swing API进行显示。当然,它感觉有点慢,所以我测量了重绘的时间,大约是32ms。然后我读了关于加速Java图形,并使用这里描述的方法:Space InvadersJava图形性能

然而,不知何故,这甚至更慢。现在需要大约98ms才能重绘。这是为什么?

请注意,我知道像LWGL和JOGL这样的库,但我不想为这种图形化简单的游戏使用完整的OpenGL包装。

+1

你可以发表一些你的绘画代码吗?和时钟/定时器逻辑? – basszero 2009-12-12 13:41:01

+0

时钟/定时器逻辑就是通过System.currentTimeMillis()获得的两个长值的差别。我知道测量这种时间并不是一个好方法,但我只是粗略估计它需要多长时间。绘画代码只是在画布上绘制静态图像。所以它只是g.drawImage(img,0,0,null),其中g是通过BufferStrategy变量获得的。 – 2009-12-12 13:48:50

回答

6
  1. 阅读this约定时器
  2. 使用一个总是睡线程在后台以降低系统中断率以获得更精确的计时器!
  3. 您可以在here
  4. 看看我的代码,我创建了一个小游戏,可以发现here

    long renderStart = System.nanoTime() 
    // render stuff here 
    long renderTime = (System.nanoTime() - renderStart)/1000000; 
    
+0

我下载了你的图书馆(Bonsai)。但我有一个问题:你创建了一个'GameEngine'类。这里有什么用途(谷歌翻译)? – 2010-01-05 17:40:40

+0

其实我的Eclipse SVN插件有问题,所以它没有远程删除文件。就在今天,我通过另一个SVN客户端删除了这个文件,这个客户端崩溃了整个eclipse项目,所以我不得不重建它,然后再次以某种方式销毁该存储库:D因此,该文件仅仅是一个开发的遗留问题,在某个时候我想从applet/gui中分解出实际的引擎。 – 2010-01-05 21:51:03

+0

感谢(15个字符) – 2010-01-06 13:04:28

6

游戏的挥杆慢。您最好的选择可能是SDL包装,例如jsdlsdljava。 SDL非常轻便,并在许多平台上得到支持。

好的是,良好实现的2D图形库包装实现了Graphics接口,所以你应该能够尝试几个,看看哪一个最适合你的应用,而无需修改你的代码。

+0

现在,jsdl和sdljava都非常缺乏数据。在Java上寻找高图形性能的大多数人只是直接使用OpenGL,例如通过LWJGL(http://lwjgl.org/) – mikera 2012-05-19 05:13:23

1

我同意尼古拉斯,图形/交互处理是伟大的

1

尝试JGame。这是2D游戏的简单引擎,它在使用GL时可以使用GL,并且可以制作从手机到台式机系统的任何游戏。

1

首先,你应该检查,看看有多少时间花在你自己的代码中,花费在实际绘制框架上的时间。您可能有一些错误或故障,使其运行速度更慢。

你应该能够得到好得多的表现,然后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不会试图为您清除组件背景。这可能是经济放缓的另一个原因。

3

我不是专家,但Java2D支持不同的渲染流水线。在我的机器,通过设置系统属性

sun.java2d.opengl =真

产生渲染速度大幅提高切换到OpenGL的一个。

6

一些提示,以提高性能:

  1. 剪辑,只是得出了变化
  2. 不要缩放任何区段描绘
  3. 使用正确的缓冲策略
  4. 使用full screen exclusive mode如果当适当。

Swing是不是天生就慢。关于Swing的大部分困惑来自不了解或不了解事件调度线程的人(是的,这需要付出很多努力才能做到)。

关于你的时候,你只是调用时间设置之间g.drawImage?如果是这样,你正在重新绘制多大的尺寸,并且你是否正在调用这个调用?

编辑:忘了提及Pulp Core - 一个非常好的Java游戏框架。

1

Java2D的表现是一种黑暗艺术。它可以在不同的平台上有所不同,但可以让它表现良好。

有时做看似无关痛痒的事情可能会导致更慢的性能。你想确保你是using accelerated images as much as possible

图像的type也可以显著。我不知道全部细节,但是我知道我的程序比类型5(3BYTE BGR)等类型1图像(INT RGB)要快得多,因为转换问题。

1

我无法确切地知道你在做什么。你的问题是关于Swing,但你提到了一个Canvas和Bufferstrategy。在Swing中,你会使用一个自动双缓冲的JPanel,所以你不必担心这个。

我测试了1000个移动球的简单动画。定时器设置为每100ms触发一次。当计时器开火时,随机移动到新位置的1000个球和一个新的BufferedImage被创建,并且显示图像的面板被重新绘制。重新绘制的时间差为110毫秒,这意味着它只需要10毫秒来创建一个新的BufferedImage并进行绘画。这幅画是全屏完成的,所以没有剪裁完成。

posting显示我所测试的示例代码。

+0

如果您想要快速测量时间,最好的方法是使用System.nanoTime()(在JDK 1.5中添加),其度量单位为纳秒。它长期不如System.currentTimeMillis准确,但在短期内显然更有效。 – 2009-12-12 18:51:16