2009-04-15 10 views
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); 
} 

この部分は968msかかります...それは遅すぎる...

+0

は、bottanLayerのディメンションは、totalCanvas Dimentionsと常に同じですか? その場合、なぜ2つのビットマップを作成するのですか? – user88637

+0

ありがとう、私は質問に理由を追加しました。 – user25749

答えて

1

ほとんどすべてのGDI +の操作は、GPU上でできるだけ多くを実行するためにドライバによって実装されるべきです。これは、単純な2Dビットマップコピー操作が「十分な」かなり大きな値であっても、「十分に速く」なることを意味するはずです。

私のお勧めは明らかです。これを行う最速の方法で時間を浪費して汗を流さないでください。あなたは問題を非常にはっきりと定式化しているので、質問で概説したように、それを明確に実装してみてください。それから、もちろん、それをベンチマークして、狩りを続けることを決めることができます。

簡単例示:

32 BPP 400×300ビットマップのサイズは約469キロバイトです。 this handy tableによると、2002年のNvidia GeForce 4 MXの理論メモリ帯域幅は2.6GB/sです。コピーが純粋な「上書き」モードで行われていると仮定すると、つまり、既存のサーフェスをブレンドしていない場合(つまり、コピーは基本的にフレームをコピー元のデータに「クリア」する方法なので)、4のオーバーヘッド係数念のために、我々が得る:

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

をこれはあなたのコピーは喜んI 1453 FPS、で実行する必要があります意味します「十分に良い」と仮定します。

+0

ありがとう!、私は試みたが、それは十分に速くないようだ... – user25749

0

DrawImageUnscaledを使用すると、DrawImageよりもはるかに高速になります(コードからは同じように見えます)。同じイメージを何度も繰り返し使用している場合は、TextureBrushを作成して使用してください。

GDI +の問題は、ほとんどの場合、それが加速されないことです。軽快な描画速度を得るためには、GDIとBitBltが必要です.GDI +には深刻な痛みがあります。特に管理されたコードの場合(管理されたC++やC++を使用しているかどうかは分かりません)

グラフィックの詳細については、postを参照してください。ネット。

関連する問題