0

レイヤーをサポートするペイント ツールを実装しようとしています。レイヤーごとに WritableRaster を作成します。キャンバスを表示するには、レイヤーを結合する必要があります。これを行う最も効率的な方法は何ですか? bufferedImage を使用し、ラスターを設定して、アルファ合成を使用して各レイヤーを Graphics コンテキストに描画できます。しかし、データレベルでマージしてから単一の画像を描画する方が良い/高速ではありませんか?

編集:プロファイリングを行いました。これは私の現在のアプローチがどのように見えるかです:

//tmp.getRaster().setRect(layer.getRaster()); // VERY slow
tmp.getRaster().setDataElements(0, 0, layer.getRaster()); //slow
g2.drawImage(tmp, 0, 0, scaledDim.width, scaledDim.height, null);

以前は各レイヤーに WritableRasters の代わりに BufferedImages を使用していましたが、目立った遅延はありませんでした。

私の次のステップは、上部と下部のレイヤーをキャッシュすることです。そのため、描画される画像は 3 つだけになります。それはおそらく問題を解決するでしょう。

4

4 に答える 4

0

それらをそれぞれイメージバッファにブリット(描画)する場合は、おそらくグラフィックカードアクセラレーションを使用しています。

個々のバッファをループして手動でマージすると(これが「データレベルで実行する」という意味だと思います)、CPUを使用することになります。

したがって、実際には、手作業で行うと、ブリッティングよりも大幅に遅くなります。


したがって、元のソリューションが最適です。グラフィックカードにその仕事を任せてください、それはそれがとても得意です。

于 2011-03-03T23:17:21.860 に答える
0

私の感覚では、ラスターを描画することは、「データ レベルで結合する」こととほぼ同じです。

ボトルネックであることに気付かない限り、これについては心配しません。

于 2011-03-03T16:17:14.857 に答える
0

おそらくあなたはJAIを使うことができます:

ParameterBlock pb = new ParameterBlock();
pb.add(bufImage1);
pb.add(bufImage2);
pb.add(....
RenderedImage ri = JAI.create("xor",pb);
于 2011-03-03T23:10:20.837 に答える
0

わかりましたので、上層と下層のキャッシュを導入したところ、かなり良いパフォーマンスが得られました。レンダリング時間に影響を与えることなく、メモリが処理できる限り多くのレイヤーを追加できます。

于 2011-03-04T02:51:21.200 に答える