这是我在这个论坛上的第一篇文章,我对Java有大约6个月的经验,也有大约1个月的Java编程(Swing)经验,所以请考虑我是一个Java新手。
我开始开发一个简单的2D射击游戏,把Java作为一个业余项目。我使用的是Java 1.6.0_65与Mac 10.6.8,Macbook Pro 2.4 GHz Intel Core 2 Duo (2010年春季型号),显示卡是NVIDIA GeForce 320米。
在我的绘画方法中,我用Swing drawRect()方法绘制了大约30-50个矩形,大小为32 * 32像素,很少有7*7像素大小,较小的矩形填充了fillRect。我从计时器回调中调用paintComponent()方法50次/秒。
为了了解绘画的速度和速度,我添加了一些度量代码,记录paintComponent()方法的开始和结束时间,并使用System.nanoTime()方法计算平均持续时间。
在OSX10.6上,每个paintComponent()的平均执行时间似乎约为3000 usec。
我也在Windows 7个人电脑上运行相同的代码(索尼Vaio笔记本电脑,AMD双核2.x GHz和惠普笔记本电脑,英特尔四核,2.x GHz,现在不记得所有细节)。在Windows机器中,平均执行时间仅为100 us,即大约快30倍!
有什么能解释这么大的差异呢?System.nanoTime()能在Windows7和OS之间使用不同的分辨率吗?还是在OS中画得那么慢?
另一方面,我还测量了游戏引擎中与GUI无关的部分(物体的移动、碰撞检测等)的平均执行时间,在两个系统上的执行时间都在50-100 us之间,所以也许System.nanoTime()是可靠的,而在OS中绘制真的那么慢吗?
编辑:我无法从xCode和Eclipse复制粘贴任何代码,我一直在抱怨格式化问题,但是您可以查看我编写的一个测试应用程序来说明这个问题,at:http://www.java-gaming.org/topics/swing-performance-os-x-10-6-vs-windows-7/31654/view.html。
我在Mac上的性能也很慢,还有这个测试应用程序,大约1400-1800 usec / paint操作。
发布于 2014-01-01 15:30:48
我在Mac上的SWT也有同样的问题。另一个观察是,在Mac上,与Windows不同的是,即使没有双缓冲,也不会有任何闪烁。这可能或不可能表明,性能不佳的根本原因是操作的额外安全性(它们可能会阻塞,直到垂直刷新,以避免闪烁)。
发布于 2015-04-29 10:38:51
基于英特尔图形的Retina显示器在MacOS X上的渲染速度似乎很慢。在这个JDK bug注释中突出显示了这一点。它是JDK 8修补程序40 (8u40)中的已解决。
在创建一个2D侧/垂直滚动游戏时,我也遇到了这个问题,并且正在研究Mac上的渲染:
我正在通过标准的JComponent#paintComponent(Graphics)方法执行我的呈现,并使用我自己的滚动双缓冲方法,这样我就可以将准备图像的时间与通过对显示设备调用Graphics#drawImage()来实际绘制图像的时间隔离开来。
如果我使用MBP的内置显示器(Intel HD Graphics 4000)绘制1680x1500图像,则需要30‘s才能完成。
如果我然后切换到外部显示器(NVIDIA GeForce GT 650米),对于相同的代码和相同的图像大小,我得到5ms的时间。
https://stackoverflow.com/questions/20870102
复制相似问题