Я пытаюсь увеличить производительность моего конвейера рендеринга. (Безусловно) самая медленная часть выполняет java.awt.imaging.LookupOp на большом изображении.
Размер изображения составляет около 2048x2048.
Я понял, что выполнение фильтра вместе с операцией рисования намного быстрее, чем вызов метода фильтра. Однако это все еще оставляет нас с операциями поиска, которые занимают приблизительно 250 мс (или 4 кадра в секунду). У кого-нибудь есть какие-нибудь советы по рендерингу?
Вот по сути то, что мы делаем:
public void paint(Graphics g)
{
if(recalcLUT)
{
Graphics2D g2d = (Graphics2D) displayImage.getGraphics();
g2d.drawImage(srcImage, lut, 0, 0);
}
Graphics2D g2d = (Graphics2D) g;
g2d.clearRect(0, 0, this.getWidth(), this.getHeight());
AffineTransform at = new AffineTransform();
at.setToIdentity();
at.scale(scale, scale);
g2d.drawImage(displayImage, at, null);
}
переменная lut - это LookupOp, обычно ShortLookupOp, изображение - 16-битное изображение в градациях серого
Спасибо
Райан Бухер:
Я знаю, что есть некоторые другие очевидные оптимизации производительности, которые можно сделать здесь. Но главная проблема - просто выполнить операцию LookupOp, поэтому я ищу совет по этому поводу.
Lookup Ops - это, по сути, место, где вы создаете массив, и вместо того, чтобы отображать каждый пиксель изображения в качестве его цвета, вы используете цвет как индекс в массиве и визуализируете цвет как значение в индексе. В этом конкретном примере я использую его для выполнения некоторых простых операций яркости / контраста.
Вы также можете реализовать это, используя rescaleOp, который по сути является способом применения линейной функции к значению всех пикселей. Но это оказывается медленнее.