Java图形性能
我正在编写一个简单的游戏,希望通过Java Graphics+Swing API来显示它。当然,感觉有点慢,所以我测量了重新上漆的时间,大约是32毫秒。然后,我阅读了有关加速Java图形的内容,并使用了下面描述的方法: 然而,不知何故,这更慢。现在重新绘制大约需要98毫秒。为什么呢Java图形性能,java,graphics,Java,Graphics,我正在编写一个简单的游戏,希望通过Java Graphics+Swing API来显示它。当然,感觉有点慢,所以我测量了重新上漆的时间,大约是32毫秒。然后,我阅读了有关加速Java图形的内容,并使用了下面描述的方法: 然而,不知何故,这更慢。现在重新绘制大约需要98毫秒。为什么呢 请注意,我知道LWGL和JOGL之类的库,但我不想为这样一个图形化的简单游戏使用完整的OpenGL包装。您可以看看。对于一个游戏来说,Swing会很慢。您最好的选择可能是SDL包装器,例如或。SDL非常轻量级,在许多
请注意,我知道LWGL和JOGL之类的库,但我不想为这样一个图形化的简单游戏使用完整的OpenGL包装。您可以看看。对于一个游戏来说,Swing会很慢。您最好的选择可能是SDL包装器,例如或。SDL非常轻量级,在许多平台上都受支持
很好的一点是,实现良好的2d图形库包装器实现了
图形
界面,因此您应该能够尝试几种,并在不修改代码的情况下查看哪一种最适合您的应用程序。我同意Nicolas的观点,因为图形/交互处理非常好试试看。它是一个简单的2D游戏引擎,在可用时使用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();
}
因此,只有当后平面是新的,或者组件的大小已调整时,才会创建后平面。这对速度有巨大的影响
从JDK1.0开始,我就一直在用java进行图形编程。事实上我从没听说过这件事。呵呵
通过基本的java图形调用,我从未遇到过获得良好帧速率的问题。另一件需要注意的事情是确保Swing不会试图为您清除组件的背景。这可能是另一个放缓的原因。我不是专家,但Java2D支持不同的渲染管道。在我的机器上,通过设置系统属性切换到OpenGL =正确
显著提高了渲染速度。一些提高性能的提示:
编辑:忘了提及-一个非常好的Java游戏框架。Java2D性能有点像一门黑暗的艺术。它可以在不同的平台之间变化,但也有可能让它表现良好 有时做一些看似无害的事情会导致性能大大降低。你要确保你是
图像的质量也可能很重要。我不知道全部细节,但我确实知道,由于转换问题,我的程序使用类型1图像(INT RGB)比其他类型(如类型5(3字节BGR))快得多。我不能确切地说出您在做什么。您的问题是关于Swing的,但您提到了画布和缓冲策略。在Swing中,您将使用自动双缓冲的JPanel,因此您不必担心这一点 我用1000个移动的球测试了一个简单的动画。计时器设置为每100毫秒启动一次。当计时器启动时,1000个球随机移动到一个新位置,并创建一个新的BuffereImage,显示该图像的面板被重新绘制。重新绘制之间的时间差为110毫秒,这意味着创建新的BuffereImage和绘制只需10毫秒。这幅画是全屏画的,所以没有剪辑
这显示了我测试的示例代码。你能发布一些绘画代码吗?和时钟/定时器逻辑?时钟/定时器逻辑只是通过System.currentTimeMillis()获得的两个长值之差。我知道这不是一个很好的测量时间的方法,但我只是想粗略估计一下需要多长时间。绘制代码只是在画布上绘制静态图像。因此,它只是g.drawImage(img,0,0,null),其中g是通过BufferStrategy变量获得的。如果您想快速测量某件事情的时间,最好的方法是使用System.nanoTime()(在JDK 1.5中添加),它以纳秒为单位测量。在长时间内它不如System.currentTimeMillis准确,但在短时间内它显然更有效。我下载了你的库(盆景)。但我有一个问题:你制作了一个类
GameEngine
。这里的目的是什么(谷歌翻译)?实际上我的Eclipse SVN插件有问题,所以它没有远程删除文件。就在今天,我通过另一个SVN客户端删除了该文件。。。这使整个eclipse项目崩溃,所以我不得不重建它,然后又以某种方式破坏了存储库:D所以这个文件只是开发过程中的遗留文件,有时我
//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();
}