Interpolación bilineal lenta de Java2D en Java 7 en Mac OS X
He estado probando mi aplicación en Java 7 en Mac OS X. Se está ejecutando notablemente lento. Utilicé VisualVM para intentar localizar dónde estaba el cuello de botella y descubrí que la interpolación lineal es la culpable:
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
Hasta cierto punto, esto tiene sentido, por supuesto. Usar la interpolación ralentizará las cosas. Pero no veo este tipo de diferencia dramática entre usar y no usar interpolación en Java 6 en OS X. En Java 6, la diferencia fue casi insignificante. (Las siguientes imágenes representan el perfil de VisualVM depaintComponent()
después de ejecutar una animación estándar en mi aplicación.)
Con interpolación:
Sin interpolación:
Pero en Java 7 en OS X, la diferencia es mucho más notable:
Con interpolación:
Sin interpolación:
Supongo que el problema radica en la aceleración de hardware y la transición de Apple a Oracle. Quizás el Java 6 de Apple estaba usando la aceleración de hardware para hacer la interpolación y ahora el Java 7 de Oracle no lo está. ¿Esto lo explica? ¿Hay alguna solución? He intentadosun.java2d.opengl=true
.
Actualización: encontré que el problema solo aparece cuando se usasetRenderingHints()
aplicar la interpolación. Si utiliza otro método para interpolar la imagen, comoAffineTransformOp
, entonces la caída de rendimiento desaparece. Por ejemplo:
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
AffineTransformOp scaleOp = new AffineTransformOp(scaleTransform, AffineTransformOp.TYPE_BILINEAR);
scaleOp.filter(screenSliceFiltered, screenSliceFilteredScaled);