2013-11-20 84 views
3

我一直在使用Java 7在Mac OS X上測試我的應用程序,它運行明顯緩慢。我用VisualVM的嘗試,並追查其中的瓶頸是,發現線性插值是罪魁禍首:在Mac OS X上Java 7中的慢Java2D雙線性插值

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

我猜問題在於硬件加速,並從蘋果到甲骨文的過渡。也許蘋果公司的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); 
+0

這表明這個問題暫時不會被修復:https://bugs.openjdk.java.net/browse/JDK-8017247 – whiskeyspider

+0

任何想法爲什麼「沒有插值」已經下降這麼低?你認爲這種方式剛剛在軟件上相對於6進行了優化嗎? –

回答

1

我認爲你已經擊中了頭部。蘋果很可能提供了JVM槓桿硬件加速。您可能會問OpenJDK的Mac Port子項目的Porters group郵件列表。