Проблемы с производительностью Java 2D при рисовании буферизованных изображений - PullRequest
0 голосов
/ 17 февраля 2010

Я создаю объект Canvas, который используется для рисования BufferedImage размером 228x262 пикселей.

Это изображение было нарисовано с использованием метода Graphics2D.drawImage (...). Я делаю пиксельные манипуляции с цветом в заданных диапазонах смещения. Пример кода ниже:

for( int i = frameOffset; i < colorClock; i++ ) {  
    rgb[i] = new Color(this.colorBK).getRGB();  
    }

Где rbg установлено для того буферизованного изображения, в котором я изменяюсь.
Проблема в том, что код рисует медленно.

Я создаю изображение с использованием GraphicsConfiguration.createCompatibleImage и использую двойную буферизацию с помощью стратегии буфера.

Любые огни, пожалуйста?

Спасибо за сообщение.

Ответы [ 2 ]

1 голос
/ 17 февраля 2010

Если вы запускаете цикл каждый раз, когда рисуете изображение, петля может стать узким местом. Существует совершенно ненужное распределение объектов, которое заставит сборщик мусора работать довольно часто.

Я предполагаю, что colorBK это int. Если это так, вы просто создаете и инициализируете объект Color и просите его вернуть значение rgb, назначенное массиву rgb. На самом деле, вы назначаете значение colorBK в массиве rgb. Таким образом, эквивалентная и более эффективная реализация будет rgb [i] = colorBK.

Чтобы оптимизировать это еще больше, вы можете присвоить значение colorBK конечной локальной переменной. Это позволит избежать повторного получения значения поля. Так что цикл может выглядеть так:

final int color = colorBK;
for( int i = frameOffset; i < colorClock; i++ ) {
    rgb[i] = color;
}

Чтобы получить еще больший прирост производительности, вам следует подумать об этом, если есть совершенно другие способы сделать это. Поскольку приведенный выше пример просто меняет некоторые пиксели на определенный цвет, я могу предположить, что это можно сделать с помощью изображения и пары fillRects.

Таким образом, вы бы заполнили прямоугольник за изображением нужным цветом (в данном случае colorBK). Если изображение имеет прозрачные пиксели в этих областях, вышеуказанные изменения цикла остаются неизменными на холсте, и получается тот же эффект. Это может быть более эффективным, поскольку графические методы лучше оптимизированы и не требуют интенсивного использования массива.

0 голосов
/ 17 февраля 2010

Не создавайте новый Цвет только для того, чтобы извлечь целое число RGB для каждого пикселя в вашем изображении. Единственный конструктор с одним параметром, который я могу найти для Color, - это тот, который принимает int RGB - вы не можете просто использовать colorBK напрямую?

Кроме того, если вы делаете это преобразование для каждой краски, которая будет медленной; вам нужно выполнить преобразование только один раз.

...