メモリ内から画面へのBitBltとメモリ内のScrollDCの速度を測定してみた。なお速度測定には、Read Time Stamp Counterを使っている。
ダブルバッファリングを使って描画する際には、よくメモリ内デバイスコンテキストから画面のデバイスコンテキストへのBitBltを使う。また、そのような状況でスクロールを行なう時メモリ内デバイスコンテキストでScrollDCを使う。いくつかのマシンでこのような時のRead Time Stamp Counterを測定してみた。
Intel Core 2 Duoマシン
CPUがIntel Core 2 Duo 2.40GHz、ビデオがNVIDIA GeForce 7600GS 256MBというもの。
平均的なクロック数
1 2 |
BitBlt(948x649): 7746.3 ScrollDC: 26719.38 |
1回あたりの時間(ミリ秒)
1 2 |
BitBlt(948x649): 0.00291 ScrollDC: 0.01004 |
ということで現代の平均的デスクトップマシンでは、BitBlt及びScrollDCはかなり軽い動作であることがわかる。なお、ScrollDCは移動幅をランダムに変えて測定したのだが、その時のクロック数との関係は下の図の通り。この通り相関はなくほぼ一定であることがわかる。
IBM ThinkPad A22m
CPUがIntel Pentium III 900MHz、ビデオはATI Rage(TM) Mobility 128というもの。
平均的なクロック数
1 2 |
BitBlt(1038x648): 8774357.5 ScrollDC: 5866386.52 |
1回あたりの時間(ミリ秒)
1 2 |
BitBlt(1038x648): 12.73492 ScrollDC: 8.51435 |
二昔かそれ以上前のノートであるが、BitBlt・ScrollDCともにわりと負荷のかかる動作であることがわかる。移動幅とクロックの関係では、相関がみられ幅が大きいほどクロック数は小さくなる。移動幅が多いほど、コピーする量が少なくなるためであると考えられる。
VMWare
Intel Core 2 DuoマシンのVMWareで測定したもの。
平均的なクロック数
1 2 |
BitBlt(1038x648): 2800406.42 ScrollDC: 1633921 |
1回あたりの時間(ミリ秒)
1 2 |
BitBlt(1038x648): 1.17 ScrollDC: 0.68 |
A22mのようにScrollDCの方BitBltより軽い。負荷については、同じマシンではあるがネイティブ動作の方が明らかに速い。グラフィックカードの性能を生かせるかどうかというところなのでしょうか。移動幅とクロックの関係では、相関がみられ幅が大きいほどクロック数は小さくなる。
Celeronマシン
CPUがIntel Celeron 2.66GHz、ビデオがRadeon 9200 Pro(128MB)というもの。
平均的なクロック数
1 2 |
BitBlt(1038x648): 26040.8 ScrollDC: 106314.6 |
1回あたりの時間(ミリ秒)
1 2 |
BitBlt(1038x648): 0.00979 ScrollDC: 0.03997 |
一昔前のデスクトップといったところ。ビデオカードを挿しているためわりと速度が出ている。移動幅とクロックの関係では、特に相関はないことがわかる。
IBM ThinkPad X40
CPUがIntel Pentium M 1.3GHz、ビデオはオンボード(Intel 855GME)というもの。
平均的なクロック数
1 2 |
BitBlt(1038x648): 6970685.88 ScrollDC: 2887839.14 |
1回あたりの時間(ミリ秒)
1 2 |
BitBlt(1038x648): 5.36 ScrollDC: 2.22 |
移動幅とクロック数の関係。相関が見られる。
おそらくGPUやVRAMの恩恵を受けれる場合、BitBltやScrollDCは高速かつ転送サイズなどにあまり影響されなくなるような感じがする。ここらへんの描画速度については、他の人も色々実験(Google:BitBlt 高速)を行っているようですね。
一応、使用したアプリケーションを置いておきます。WTLで作ってます。