我一直在Mac OS X上用Java 7测试我的应用程序。它运行明显缓慢。我使用VisualVM尝试追踪瓶颈的位置,发现线性插值是罪魁祸首:
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
在某种程度上,这当然是有道理的。使用插值会降低速度。但是我没有看到在OS X上使用和不在Java 6中使用插值之间的这种显着差异。在Java 6中,差异几乎可以忽略不计。 (下图显示了在我的应用程序中运行标准动画后paintComponent()
的VisualVM配置文件。)
使用插值:
没有插值:
但是在OS X上的Java 7中,差异更加明显:
使用插值:
没有插值:
我猜测问题在于硬件加速以及从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);