这是我在这个论坛上的第一篇文章,我有大约 6 个月的 Java 总体经验,以及大约 1 个月的 Java GUI 编程(Swing),所以请将我视为 Java 新手。
作为一个爱好项目,我开始使用 Java swing 开发一个简单的 2D 射击游戏。我在 Mac OS X 10.6.8、Macbook Pro 2.4 GHz Intel Core 2 Duo(2010 年 Spring 型号)上使用 Java 1.6.0_65,显示卡是 NVIDIA GeForce 320M。
在我的 paint 方法中,我用 Swing drawRect()
方法绘制了大约 30-50 个矩形,大小为 32 * 32 像素,少数是 7 * 7 像素,较小的是用 fillRect
填充。我从计时器回调调用 paintComponent()
方法 50 次/秒。
为了了解绘画的快慢程度,我添加了一些测量代码,以记录 paintComponent()
方法的开始和结束时间,并计算平均持续时间,使用System.nanoTime() 方法。
在 OS X 10.6 上,每个 paintComponent()
的平均执行时间似乎约为 3000 usec。
我还针对 Windows 7 PC(Sony Vaio 笔记本电脑、AMD 双核 2.x GHz 和 HP 笔记本电脑、Intel 四核、2.x GHz,现在不记得所有细节了)运行相同的代码。在 Windows 机器中,平均执行时间仅为 100 微秒左右,快了大约 30 倍!
什么可以解释如此大的差异? System.nanoTime()
可以在 Windows 7 和 OS X 之间使用不同的分辨率,还是在 OS X 中绘画真的那么慢?
另一方面,我还测量了游戏引擎中非 GUI 相关部分(对象移动、碰撞检测等)的平均执行时间,两个系统上的执行时间都在 50 - 100 微秒之间,所以也许System.nanoTime()
可靠,在 OS X 中绘画真的那么慢吗?
编辑:我无法从 xCode 和 Eclipse 复制粘贴任何代码,我不断收到有关格式化的提示,但您可以查看我编写的测试应用程序来说明这个问题,网址为: http://www.java-gaming.org/topics/swing-performance-os-x-10-6-vs-windows-7/31654/view.html .
我在 Mac 上使用此测试应用程序时的性能也很慢,大约 1400 - 1800 微秒/绘画操作。
最佳答案
我在 Mac 上使用 SWT 时遇到了同样的问题。另一个观察结果是,与 Windows 不同,在 Mac 上,即使没有双缓冲,也不会出现任何闪烁。这可能表明也可能不表明性能不佳的根本原因是增加了操作的安全性(它们可能会阻塞直到垂直刷新,以避免闪烁)。
关于Java Swing 性能 OS X 10.6 与 Windows 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20870102/