1

実行時に 2700x1600 の画像をアルファ ブレンドする必要があります。複数の「デッキ」が同時に実行されていますが、基本的にはスライドショーです。この図の各列は、任意の時点でのプログラムの状態を表しています。

imageA1 <-blend-> imageA2 <-blend-> imageA3 ...
imageB1 <-blend-> imageB2 <-blend-> imageB3 ...
imageC1 <-blend-> imageC2 <-blend-> imageC3 ...
imageD1 <-blend-> imageD2 <-blend-> imageD3 ...
imageE1 <-blend-> imageE2 <-blend-> imageE3 ...
imageF1 <-blend-> imageF2 <-blend-> imageF3 ...

まったく驚くことではありませんが、フレームレートを維持するのに問題があります。オフスクリーン バッファでブレンディングを試みましたが、あまり役に立たなかったようです。この状況に適用できる、これほど大きな画像を操作するための一般的な戦略はありますか? おそらく、グラフィックカードを最大限に活用するための何か?

これは、現時点での私の基本的な戦略です (非常に単純化されたコード、Java ではなく処理)。

PImage a = loadImage("imageA.png");
PImage b = loadImage("imageB.png");
PGraphics buffer = createGraphics(width, height, OPENGL);

void draw () {
    buffer.beginDraw();
    buffer.tint(255, 200);
    buffer.image(a, 0, 0);
    buffer.tint(255, 100);
    buffer.image(b, 0, 0);
    buffer.endDraw();
    image(buffer, 0, 0);
}

私は Java/ Processingを使用していますが、生の JOGL でのアドバイスは大歓迎です。

また、メモリの管理にも少し問題があります。圧縮されていないこれらの各画像は最大 17MB (2700x1600x4 バイト) であり、合計で最大 60 個の画像がブレンドされます (すべて同時にではありません!)。この質問の範囲外のメモリの問題に対する戦略を念頭に置いていますが、コンピューターのメモリとグラフィックカードのメモリ使用量のバランスを取る賢い方法がある場合に備えて、ここに含めます。

(気になる人のための追加情報: 私の理解では、Processing のimage()呼び出し (画像オブジェクトを画面に描画する) は、その基礎となる実装に JOGL を使用します。この理解は、Processing のPGraphics.imageImpl() メソッドのソースを見ることから得られます。 PGraphicsOpenGL レンダラー (私は) を使用すると、PGraphicsOpenGL.rawPolys()内のネイティブ JOGL 呼び出しで終了します。)

4

1 に答える 1

1

最悪の敵はディスク I/O です。以前は、処理が必要なすべての画像を保持するメモリ バッファーを使用していました。あなたの場合、そのバッファーは 60 枚の画像のスライスになります... 10 枚の画像スライス バッファーとします。

プロデューサースレッド-1:

ディスクから画像を読み込む --->|10 画像バッファ|----->FIFO 方式で画像を処理する

Consumer Thread-2: 画像を表示する準備ができました --->|表示バッファ|----->画像を描画します

また、JProfiler でコードをプロファイリングして、他のボトルネックを確認することもできます。

于 2013-01-17T15:17:55.407 に答える