我一直在Mac OS X上使用Java 7测试我的应用程序。发现它运行缓慢。我使用VisualVM来追踪瓶颈所在,结果发现线性插值是罪魁祸首:
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
在某种程度上,这当然是有道理的。使用插值会减慢速度。但我在Mac OS X上使用Java 6时,并没有看到使用和不使用插值之间的明显差异。在Java 6中,差异几乎可以忽略不计。(下面的图像代表运行我的应用程序中标准动画后
paintComponent()
的VisualVM配置文件。)使用插值: 不使用插值: 但是在Mac OS X上使用Java 7时,差异更加明显:
使用插值: 不使用插值: 我想问题出在硬件加速和从苹果到Oracle的转变上。也许苹果的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);