レンダリング パイプラインからさらにパフォーマンスを絞り出そうとしています。(はるかに) 最も遅い部分は、大きな画像に対して java.awt.imaging.LookupOp を実行することです。
画像サイズは約2048x2048です。
描画操作と一緒にフィルターを実行すると、フィルター メソッドを呼び出すよりもはるかに高速であることがわかりました。ただし、これでも約 250 ミリ秒 (または 4 fps) かかるルックアップ操作が残っています。レンダリングのヒントはありますか?
基本的に私たちがやっていることは次のとおりです。
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 操作を行うことなので、それに関するアドバイスを探しています。
ルックアップ Ops は基本的に配列を作成する場所であり、画像の各ピクセルをその色としてレンダリングする代わりに、その色を配列のインデックスとして使用し、その色をインデックスの値としてレンダリングします。この特定の例では、単純な明るさ/コントラスト操作を行うために使用しています。これは、基本的にすべてのピクセルの値に線形関数を適用する方法である rescaleOp を使用して実装することもできます。しかし、これは遅くなることが判明しました。