円を描画するプログラムを最近作っていて、とりあえずの目標は達成出来た。

滑らかに移動表示されるように、サブピクセル単位で座標を指定出来るようにしている。あと円の縁が滑らかに表示されるように縁のアンチエイリアシングをしている。2pixel幅なのでそこまで滑らかでは無いけれど。。

円描画では、殆どの画素は縁以外の内側の場所で画素の値は同じになる。なので横線塗りつぶし処理をどれだけ高速化するかによって全体の描画速度が決まる事に気付く。

速度比較の為にGDI+で同様の円描画をしてみたところ、AntiAliasingの品質がちょっと低い事に気づく。そして半透過じゃない塗りつぶし領域があった場合にも半透過処理をしてしまっているのか速度が変わらない。これはもったいない…。

自分のプログラムでSSE2で横線の塗りつぶし処理を最適化してみると、GDI+の円描画処理と比べて3倍くらい速く描画出来る事が確認出来た。今度Direct2Dも試してみよう。

浮動小数点型で計算をしているんだけれど、プロセッサによっては浮動小数点演算回路を搭載していなかったり、整数演算に比べて性能が低いので、固定小数点演算で処理する実装も作ろうかと思う。モバイルとか組み込み用途で役立つかもしれない。

しかしこういうprimitiveな描画処理で出せる結果は単純過ぎる。自由な絵作りをするとなるともっとずっと多機能で多彩な描画処理が求められる気がする。。まぁわざわざ計算しなくても用意した画像を使ってしまえば良い気もするけれど。

Flashの描画APIのdrawCircleはベジェ曲線を使って描画されているのか精度が少し悪いみたいだ。でも線の本数増やして円を近似すれば問題にならないのかも?
http://wonderfl.net/c/djBq