LockRectの挙動

Imageオブジェクトをロックして四角や円を描画するときに、今は全範囲をロックしている。
大きな画像に小さい絵を描画しようとすると、全範囲の転送が発生するから、かなり無駄になっているはずだ。
これを少しいじってみる。


640*480の画像に対してランダムで1フレーム1回Box描画して、fps指定を無しとすると、だいたい180fps。
これを描画範囲のみロックするように変えてみたところ、800fpsオーバーに跳ね上がった。
素晴らしい加速度合いだ。
当然小さな画像に対して目一杯描画している場合は効果がない。
Circle描画のほうは、原点と半径を渡されてそこから計算するからロック範囲の計算が面倒だった。
そこで、Circleのアルゴリズムは横Lineをたくさん引いているんでとりあえずLineごとにロックしたら、これがまったく速度が上がらず180fps。
ロックを大量にやってダーティ領域が増えすぎると、諦めて全体の転送をするようにでもなっているんだろうか。
Circleのサイズを小さくしていったら、半径1と2以上で綺麗に切り替わる。
半径1はロック3回、半径2はロック5回だから、その間あたりに諦めるラインが存在するのか。
Circle描画を高速化するには、めんどくさがらずにちゃんとロック範囲を計算する必要があるようだ。


いままでWindow.draw系しか最適化を考えてこなかったが、Imageオブジェクト間編集などができるようになると、そっちも考えていかないといけない。
とんでもなく速くなることは根本的に無いと思うが、とんでもなく遅いのでは使いにくくてしょうがない。