Hatena::ブログ(Diary)

パジャマdeブロッガー(myugaruのヲタ日記) このページをアンテナに追加 RSSフィード

myugaruの色々構想中・・・! - 本気でゲームやコンピュータに打ち込むブログ
myugaruの作ったプログラム達New! 最終更新2008/3/1)

2007年12月12日 Shapeクラス(検証),テストアプリ公開

[][][]透過色と透過度(Alpha値)

さて昨日、Shapeには透過色の考慮が無いと書いたが正確には『Alphaブレンドを考慮して描画しない事』と『透過色の概念が無い事』の2つのことを混ぜて書いてしまっていた。さらには『結果としてのビットマップが透過機能を持つ事』と『描画ルーチンが透過の機能を持つ事』という概念もあるので色々と紛らわしかった。ここでちゃんとこれらについて補足しておこうと思う。

まずビットマップにおける透過について。

  1. 透過色という色を1つ決めておく方法
  2. 個々の画素に対して透過度を決める方法

1についてはGif画像などが採用していて画像同士の重ね合わせの際に下の画像が透けて見える効果を有効にするために考えられた方法である。2についてはビットマップそのものでは32ビットフォーマットでなければ持たせようが無いが画素ごとに透過度合いが決められ、別の画像と重なる際にはAlphaブレンドされるという仕組みである。

次に描画ルーチンにおける透過について。

  1. 透過色という色を1つ決めておく方法
  2. 個々の画素に対して透過度を決める方法

1については描画ルーチンで透過色という考え方は普通は用いないと思う。2については上記のビットマップの透過度とは違う。描画する際にビット毎のAlphaブレンドを行って画素へは何らかの方法でそれぞれのビットフォーマットへットに変換して保管すればよいからだ。

わかりやすく言えば、ビットマップが24ビットだろうが8ビットだろうが、描画ルーチンに渡す引数としての色には32ビットが渡せる事からこういうことになっているのだ。結果としての透過(=ビットマップへ保管される透過)と方法としての透過(=描画ルーチンの引数)との区別である。

Shapeでは方法としての透過はまったく考慮されていない。が、32ビットビットマップであれば結果としての透過だけは一応実装されている(引数に渡した透過度(Alpha値)をちゃんとセットにいくので)。

ということで検証についてはこういう点も踏まえていろんなパターンの実験が出来る環境を作りたいと思う。

[][]Shape(検証結果)

BmpProc1BmpProc8BmpProc24BmpProc32
直線Shape
GDI+
GDI
0.1438


0.1352


0.1663
0.3687
0.2018
0.1788
0.4335
0.2007
長方形(枠)Shape
GDI+
GDI
0.2009


0.1746


0.2508
0.5525

0.2828
0.6916

長方形(塗潰し)Shape
GDI+
GDI
3.5225


2.6038


3.2916
3.6074
0.7303
3.8797
2.8966
0.7292
楕円(枠)Shape
GDI+
GDI
0.2558


0.2331


0.2891
0.8019

0.3174
0.9332

楕円(塗潰し)Shape
GDI+
GDI
7.1987


5.505


7.2338
3.1215
0.8306
8.5916
2.5891
0.8264

上記はそれぞれの描画を私のPCで10000回ずつ行った結果(単位は秒)である。これらから

  1. Shapeの塗潰しはかなり遅い
  2. Shapeの塗潰し以外ではかなりの速度が出ていると思う
  3. パレットで色指定する1bit形式、8bit形式のビットマップではGDI+が使えない(Graphicsの制限)
  4. GDIは今回GDI+を一旦つくり、そこからHDCハンドルを取得したのでGDI+が使えないビットマップでは確認できていない。

今回のテストに使ったアプリはhttp://www4.atpages.jp/myugaru/のShapeTest.zipでダウンロードできる。

大体目的のものになったように思うのでShape検証についてはこれで一旦完了とする。