Langsame bilineare Java2D-Interpolation in Java 7 unter Mac OS X
Ich habe meine App in Java 7 unter Mac OS X getestet. Sie läuft merklich schleppend. Ich habe VisualVM verwendet, um zu versuchen, den Engpass zu lokalisieren, und habe herausgefunden, dass die lineare Interpolation der Schuldige ist:
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
Bis zu einem gewissen Grad macht dies natürlich Sinn. Die Verwendung der Interpolation verlangsamt den Vorgang. Ich sehe jedoch keinen derart dramatischen Unterschied zwischen der Verwendung und Nicht-Verwendung von Interpolation in Java 6 unter OS X. In Java 6 war der Unterschied nahezu vernachlässigbar. (Die folgenden Bilder stellen das VisualVM-Profil von darpaintComponent()
nach dem durchlaufen einer standard animation in meiner app.)
Mit Interpolation:
Ohne Interpolation:
In Java 7 unter OS X ist der Unterschied jedoch viel deutlicher:
Mit Interpolation:
Ohne Interpolation:
Ich vermute, das Problem liegt in der Hardwarebeschleunigung und dem Übergang von Apple zu Oracle. Möglicherweise verwendete Apples Java 6 die Hardwarebeschleunigung, um die Interpolation durchzuführen, und jetzt ist es nicht mehr das Java 7 von Oracle. Erklärt das das? Gibt es eine lösung ich habe es versuchtsun.java2d.opengl=true
.
Update: Ich habe festgestellt, dass das Problem nur bei Verwendung auftrittsetRenderingHints()
Interpolation anwenden. Wenn Sie das Bild mit einer anderen Methode interpolieren, zAffineTransformOp
, dann verschwindet der Leistungseinbruch. Zum Beispiel:
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
AffineTransformOp scaleOp = new AffineTransformOp(scaleTransform, AffineTransformOp.TYPE_BILINEAR);
scaleOp.filter(screenSliceFiltered, screenSliceFilteredScaled);