在Mac OS X上实现Java 6硬件加速

5
我有一个Java应用程序,加载了一个TTF字体并使用Graphics2D的drawString方法。这个方法每50毫秒被调用一次,x和y的位置每次都会变化,以使文本移动。当我在Windows上运行程序时,CPU使用率为0-1%,但在Mac上则为75%左右。这台Windows机器的CPU更好,但不应该有这样大的差异。我认为这与硬件加速有关,我想知道如何启用它。我发现了一些 Mac特定的Java属性,但没有降低我的CPU使用率。有什么办法可以提高OS X上的Java 2D性能吗?谢谢。
编辑1:我以为这些属性会有所帮助,但实际上并没有。
System.setProperty("sun.java2d.opengl", "true"); System.setProperty("apple.awt.graphics.UseQuartz","true"); System.setProperty("apple.awt.graphics.EnableQ2DX","true");

编辑2: 您可以在此处下载项目源代码和字节码: http://drop.io/ExampleScreenSaver

编辑3: 由于drop.io不再存在,我已将该项目上传至Google Code。现在您可以浏览代码而无需下载。我仍然不知道如何解决这个问题,所以任何帮助都将不胜感激。


1
不是电脑的问题,但我相当确定。两台机器都有Core 2 Duo处理器:Windows为3.0GHz,Mac为2.0GHz。Windows有2GB的RAM,Mac有4GB。Windows使用集成的英特尔图形,Mac使用Nvidia 9400m。Windows按预期运行,而Mac每次都达到75%。将刷新时间从50ms增加到500ms显然不再流畅,而Mac仍然处于大约50%的CPU使用率。 - styfle
你能否提供一个例子? - trashgod
2
请记住,Mac上的JVM由苹果提供,而在Windows上,您使用另一家供应商(很可能是Sun)的JVM。不同的JVM以不同的方式实现事物,因此这可能是完全“正常”的行为。 - Durandal
1
我了解JVM是由苹果提供的,但我不认为这种情况是“正常的”。我没有进行任何3D操作,所以图形应该能够很好地处理它。我相信这与在Windows上默认启用硬件加速有关,而在Mac上可能被隐藏在某个属性中。我不认为有人会同意,在Core 2 Duo上运行75% CPU使用率的简单2D屏幕保护程序是“正常的”。我很快会发布一个例子。 - styfle
苹果公司有一个非常活跃的邮件列表,可以在这里找到:http://lists.apple.com/mailman/listinfo/java-dev。苹果公司的工作人员保持着积极的存在。你的问题很可能可以在那里找到解决方案。 - Erik
3个回答

2
在“jvisualvm”中运行分析器,以确定时间消耗的位置。

1
我运行了jvisualvm并在CPU上使用了分析器。这正是我所期望的:绘制方法的自身时间为89%,其次高的是paint方法(我使用@override),占7%。这是预期的,因为我有一个Swing计时器,每30ms调用一次paint方法,并且对于每个对paint方法的调用,都会调用draw方法以使它们移动几个像素。但回到我的最初问题,如何使其像Windows一样运行(CPU使用率非常低)? - styfle
你能否提供一个小的自包含示例,让我可以在我的 Mac 上进行测试? - Thorbjørn Ravn Andersen
1
好的,我做了一个小例子,只有字母Z在屏幕上移动。结果是相同的:在Mac上,CPU使用率为70-90%,在Windows XP上,CPU使用率为0-2%。 - styfle
我查看了问题中链接的示例代码。在我的Core 2 Duo MacBook Pro上,我看到与您相同的行为。对JVM的各种提示并没有改善性能。我现在的猜测是JVM必须转换发送到屏幕的像素,从而导致减速。 - Thorbjørn Ravn Andersen
1
@I82Much:我把示例放在原帖中了。 @Thorbjørn Ravn Andersen:谢谢您的关注。我只需要找到一种方法来强制Java使用显卡来减轻CPU的负担。 - styfle
抱歉,我无法提供帮助。我对Graphics2D不是很熟悉。 - Thorbjørn Ravn Andersen

1

苹果JVM字体处理是特定于MacOS X的。例如,如果当前字体中找不到字符的字形,则JVM会查找另一个字体来显示该字符。此外,默认情况下启用反锯齿(如果您想进行比较,请检查Windows上是否已启用)。

我并不惊讶苹果的实现使用了更多的CPU。


我已经在Windows和OS X上都尝试过AA。在这两个操作系统上,AA确实会增加CPU使用率,但是在Windows上它从0%增加到大约5%,而在OS X上则从75%增加到大约100%。至于字体无法正常工作的问题,我认为这不是问题的一部分,因为该字体在这两个操作系统上都可以使用。你尝试运行代码了吗? - styfle
我刚在我的Mac上尝试了一下(没有字体),我只能确认你所写的:75%的CPU,主要是由sun.java2D.SunGraphics2D.drawString()消耗的。我不知道如何改进它。恐怕这个实现只是没有被优化...我建议尝试使用图像缓冲区来避免在你发布的示例中过于频繁地调用drawString。 - Damien

0

在调用Java时可以启用OpenGL,例如:

java -Dsun.java2d.opengl=true MyJavaGame

从Java应用程序内部启用OpenGL

System.setProperty("sun.java2d.opengl", "true"); 

不确定这在iOS / Linux / Android上如何实现,可能需要更多的研究。


我在原始问题中写过这个,并提到它没有起作用。 - styfle
该死。我通过进行软件渲染来解决它。将图像块传输到数组中,并将其用作缓冲图像的源,然后使用纳秒定时并同步以保持平滑,达到60帧。 - Chaoslab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接