0

私は 3 ビットマップ ポイントを持っています。

Bitmap* totalCanvas = new Bitmap(400, 300, PixelFormat32bppARGB);  // final canvas
Bitmap* bottomLayer  = new Bitmap(400, 300,PixelFormat32bppARGB); // background
Bitmap* topLayer = new Bitmap(XXX); // always changed. 

複雑な背景をbottomLayerに描いていきます。totalCanvas の複雑な背景を何度も再描画したくないので、bottomLayer に格納しました。

TopLayer は頻繁に変更されました。bottomLayer を totalCanvas に描画したい。最速の方法はどれですか?

Graphics canvas(totalCanvas); 
canvas.DrawImage(bottomLayer, 0, 0);  step1
canvas.DrawImage(topLayer ,XXXXX);   step2

step1をできるだけ速くしたい。誰かサンプルをくれませんか?どうもありがとう!

くつろぎの答えをありがとう。次のコードを書きます。

Graphics canvas(totalCanvas); 
for (int i = 0; i < 100; ++i)
{
canvas.DrawImage(bottomLayer, 0,0);
}

この部分は 968 ミリ秒かかります...遅すぎます...

4

2 に答える 2

1

可能であれば (コードからそのように見えます)、DrawImageUnscaled を使用すると、DrawImage よりも大幅に高速になります。または、同じ画像を何度も使用している場合は、TextureBrush を作成して使用します。

GDI+ の問題は、ほとんどの場合、高速化されていないことです。非常に高速な描画速度を実現するには、GDI と BitBlt が本当に必要です。これは、特にマネージ コードを使用している場合 (マネージ C++ を使用しているのか、ストレート C++ を使用しているのかわかりにくい場合)、GDI+ を使用するのは非常に困難です。

.net ですばやくグラフィックスの詳細については、この投稿を参照してください。

于 2009-04-18T16:27:45.960 に答える
1

ほとんどすべての GDI+ 操作は、可能な限り GPU で実行するためにドライバーで実装する必要があります。これは、単純な 2D ビットマップ コピー操作が、「十分」な非常に大きな値であっても「十分に高速」であることを意味するはずです。

私の推奨事項は明らかです。これを行うための「最速」の方法を探すことに時間を費やして汗を流さないでください。問題を非常に明確に定式化したので、質問で概説したように実行して、それを明確に実装してみてください。もちろん、先に進んでベンチマークを行い、ハントを続行することを決定できます。

簡単な例:

32 bpp 400x300 ビットマップのサイズは約 469 KB です。この便利な表によると、2002 年の Nvidia GeForce 4 MX の理論上のメモリ帯域幅は 2.6 GB/s です。コピーが純粋な「上書き」モードで行われると仮定すると、つまり、既存のサーフェスのブレンドは行われず (コピーは基本的にフレームをコピーのソース データに「クリア」する方法であるため、これは正しいように聞こえます)、オーバーヘッド係数は 4 であると仮定します。安全のために、以下を取得します。

(2.6 * 2^30 / (4 * 469 * 2^10)) = 1453

これは、コピーが 1453 FPS で実行される必要があることを意味します。

于 2009-04-15T08:42:06.917 に答える