2009-06-12 14 views
4

C#でタイルベースのマップエディタを作成すると、X、Y軸を繰り返し処理し、Graphics.DrawImage()を呼び出して、タイルセットのビットマップからマップのビットマップに1つのタイルを配置します。このプロセスは完了するまでに数秒かかります。新しい地図を読み込んだり、タイルセットを変更したりするときに一度だけ行います。そこからの編集は、編集されたタイルだけの比較的高速なブリットです。このタイルブリッタはもっと速くなりますか?

今、私は今日前に戻ってきて、自分の選択肢について考えました。 Graphics.DrawImage()は、3つのうちの唯一のものです(DrawImageUnscaledとDrawImageUnscaledAndCropped(?)である)、ソース原点の指定が可能です。 DrawImageUnscaled()は大いにより速くでしたが、常にソースビットマップの左上からblittedされました。

WinAPIの者とsetPixel対 POKEing対のQuickBasic PSETの速度のビデオメモリを搭載したシャープは対照的に

、またはVB6のPSET、簡単な取得/とsetPixelループが早くDrawImageUnscaledコールようだったが、唯一のdrawImageがあろうとトリミングでしたさもなければ。

これは今のところ十分速いですが、私は直接画像操作のようなものがさらにスピードを上げることができるかどうか疑問に思っていましたか? LockBitsでおそらく何か、私は何も知らない機能について知っていますか?

+1

これはあなたの質問に対する答えではありませんが、イメージの長方形全体(X、Y、幅、高さ)を定義することによってDrawImageの速度を上げることができます。私のテストでは、私は約20%のスピードアップを達成しました。 –

答えて

1

このための優れた答えは、あなたがするLockBitsルートを行く行う場合は、速度差とフォローアップを投稿することができ... How to manipulate images at the pixel level in C#

であります。

+0

私は今そこを見て、私が思いつくことができるものを見ます。ありがとう。 – Kawa

1

ソフトウェアブリッティングは、深刻なボトルネックのようです。私は真剣にこのような作業のためのハードウェアアクセラレーションの描画を検討することを提案します。

+0

少なくとも首が目立つほど広い。 – Kawa

1

簡単な取得/とsetPixelループは、その後あなたは間違いなく何か間違ったことをやっているDrawImageUnscaledコール

として の速さでした。 GetPixelSetPixelメソッドはかなりのオーバーヘッドを持っています。DrawImageメソッドのいずれかを使用すると、100倍高速のようになります(タイルが2x2ピクセルのように非常に小さい場合を除きます)。

その名前とは異なり、DrawImageUnscaledメソッドはサイズ変更せずに描画されません。代わりに、画像のPPI設定を使用して、同じ測定値に拡大縮小します。つまり、100 PPI設定のビットマップがあり、50 PPI設定のビットマップを描画すると、2倍のサイズにリサイズされます。

イメージを変更しないで描画する場合は、Graphicsオブジェクトの画質設定を変更して速度を調整することができます。たとえば、InterpolationModeプロパティをNearestNeighborに設定して、補間を行わないようにすることができます。

ビットマップに描画する代わりに、LockBitsUnlockBitsを使用してビットマップのピクセルデータに直接アクセスすることもできます。

関連する問題