Я тестировал свое приложение в Java 7 на Mac OS X. Он работает заметно вяло. Я использовал VisualVM, чтобы попытаться отследить, где узкое место было найдено и линейной интерполяции виновником:Медленная билинейная интерполяция Java2D в Java 7 на Mac OS X
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
В какой-то степени это имеет смысл, конечно. Использование интерполяции замедлит работу. Но я не вижу такой драматической разницы между использованием и не использованием интерполяции в Java 6 на OS X. В Java 6 разница была почти незначительной. (Изображения ниже представляют профиль VisualVM из paintComponent()
после запуска через стандартную анимацию в моем приложении.)
С интерполяцией:
без интерполяции:
Но в Java 7 на OS X разница намного заметнее:
С интерполяцией:
без интерполяции:
Я предполагаю, что проблема заключается в аппаратном ускорении и переходе от Apple, в Oracle. Возможно, Apple Java 6 использовала аппаратное ускорение для интерполяции, а теперь Java-версия Oracle - нет. Объясняет ли это это? Есть ли решение? Я пробовал 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);
Это говорит о том, что эта проблема не будет исправлена какое-то время: https://bugs.openjdk.java.net/browse/JDK-8017247 – whiskeyspider
Любая идея, почему «без интерполяции» упала настолько низко? Считаете ли вы, что этот путь только что был оптимизирован в программном обеспечении vis-a-vis 6? –