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);

Antworten auf die Frage(1)

Ihre Antwort auf die Frage