カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2018年04月19日(木)

Gdiplus 矩形と円の描画、AlphaBlend などの速度を計測してみた

SVG エディター ストローク でたくさん制御点を描画したときに、
重いよーな気がしたので、色々とテストしてみました。

Gdiplus の DrawLine で矩形を描画したときの速度

DrawRect_10 109
DrawRect_20 141
DrawRect_40 219
DrawRect_80 390
DrawRect_160 734
DrawRect_320 1422

例えば 1 行目。
_10 は、10 x 10 ピクセルの矩形を
10000 回描いた場合の時間 (ミリ秒) です。

矩形なので 1 回ごとに、
DrawLine が 4 回呼ばれます。

描画先は、32 bpp の DIB から作成した Graphics。
SetPixelOffsetMode(PixelOffsetModeHighQuality);
SetSmoothingMode(SmoothingModeHighQuality);
な感じ。まぁ、だいたい 2 倍ずつ時間が増えてますね。

次に、Gdiplus の DrawEllipse で円を描画したときの速度

DrawCircle_10 187
DrawCircle_20 297
DrawCircle_40 500
DrawCircle_80 718
DrawCircle_160 1297
DrawCircle_320 2313

やはり、DrawLine と似た傾向ですが、
やや複雑な分、ちょっと時間がかかりますね。

で、何度も描く、(小さな) 図形の場合は
画像にしておいて、アルファブレンドしたら
速くなるのか、テストしてみます。

AlphaBlend_10 109
AlphaBlend_20 110
AlphaBlend_40 156
AlphaBlend_80 281
AlphaBlend_160 781
AlphaBlend_320 2609

こちらは画像を全部参照するので、
長さが 2 倍になると処理量は 4 倍になります。

320 > 160 は 1 / 4 に近いといえなくもないですが、
それ以外では、全然 1 / 4 になってません。

小さい画像を AlphaBlend する場合は、もっと速くていいはず。
なので、適当に書いた自前の AlphaBlend でテストしてみます。

OwnAlphaBlend_10 0
OwnAlphaBlend_20 32
OwnAlphaBlend_40 141
OwnAlphaBlend_80 531
OwnAlphaBlend_160 2172
OwnAlphaBlend_320 8609

やはり、_10 とか _20 だと速いですが、
逆に、80 以上では、遅いです。

AlphaBlend はセットアップに時間がかかる一方、
データー処理は高速になるような方法を使ってますね。

グラフィックスカードの機能を
使ってるのかもしれません。

ま、そんなわけで、比較的小さな画像を
別の画像に合成するには、自前の
AlphaBlend で描くのが速そうです。

・・・

一応、勘違いのないように補足しときます。

「小さい画像をたくさん描く場合、
グラフィックスカードの描画を使わない方が速い」

ような結論に見えますが、そうじゃないです。

AlphaBlend ではおそらく
グラフィックスカードの何らかの初期化と
クリーンナップが毎回行われているため遅くなっているだけです。

通常、グラフィックスカードの機能で画像を描く場合、
初期化、描画、クリーンナップの指示をした後で
一気に処理するため、初期化の時間はあまり影響しなくなります。

なので、グラフィックスカードの性能をきちんと引き出せば
普通は、CPU による処理より、速くなります。

ま、あくまで一般論ですけど。

・・・

あ、あと、同じ画像を何回も参照してるから、
CPU のキャッシュが、よく効いてます。

違う画像を次々に描く場合は、
もっと、遅くなるでしょうねー。

ストローク
ストローク ダウンロード
ストローク サンプル画像
ストローク 更新履歴
ご意見・ご要望連絡窓口


コメント
コメントする