Mac OS X上Java 7中的慢Java2D双线性插值

时间:2013-11-20 22:55:57

标签: java performance macos java-7 openjdk

我一直在Mac OS X上用Java 7测试我的应用程序。它运行明显缓慢。我使用VisualVM尝试追踪瓶颈的位置,发现线性插值是罪魁祸首:

g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

在某种程度上,这当然是有道理的。使用插值会降低速度。但是我没有看到在OS X上使用和不在Java 6中使用插值之间的这种显着差异。在Java 6中,差异几乎可以忽略不计。 (下图显示了在我的应用程序中运行标准动画后paintComponent()的VisualVM配置文件。)

使用插值:

enter image description here

没有插值:

enter image description here

但是在OS X上的Java 7中,差异更加明显:

使用插值:

enter image description here

没有插值:

enter image description here

我猜测问题在于硬件加速以及从Apple到Oracle的过渡。也许Apple的Java 6使用硬件加速来进行插值,而现在Oracle的Java 7则没有。这解释了吗?有解决方案吗?我试过sun.java2d.opengl=true

更新:我发现仅在使用setRenderingHints()应用插值时才会出现此问题。如果使用其他方法插入图像,例如AffineTransformOp,则性能下降消失。例如:

g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
AffineTransformOp scaleOp = new AffineTransformOp(scaleTransform, AffineTransformOp.TYPE_BILINEAR);
scaleOp.filter(screenSliceFiltered, screenSliceFilteredScaled);

1 个答案:

答案 0 :(得分:1)

我觉得你已经敲了敲头。 Apple很可能提供了JVM杠杆硬件加速。您可以在OpenJDK的Mac Port子项目的Porters group邮件列表中询问。