- 2010-03-09 (火) 13:36
- C言語(Windows)
「初級編」のサンプル「宇宙戦艦ディフェンスゲーム」をDirect2Dに移植してみました。
http://i-libro.net/game/playroom/showgame.php?gameid=84
※Windows XPでは動作しません。7かVista SP2が必要です。
速くてしかも軽いです。左画像がGDI+版、右画像がDirect2D版ですが、倍の25fpsで動かしてもCPU使用率が15~20%程度に収まってしまい、クロックダウンしてしまっています。50fpsでも使用率25%程度。ただし、GPUには負荷がかかっているらしく、ゲームの実行中はウィンドウを動かすなどのデスクトップ操作がガタつくことがありました。
また、60fpsではゲームがまともに動かず、終了させるのも不安定な状態になりましたが、これはプログラムの作り方の問題か(ムリヤリ改造したので)、パソコンのスペック不足かもしれません。
テスト環境はCore 2 Duo2.0GHz、GPUはIntel 965チップセット内蔵という一昔前のビジネスノートなので、それでこれだけ動くなら大したものだと思います。Windows XPで動かないのが最大のネックですが、最近になってようやく脱XPが進み始めたようなので、Direct2Dを使ったソフトが色々出るといいですね。
Direct2Dの基本情報では、こちらのブログが参考になりました。
http://www.tkzdev.net/?p=12
後はmsdnライブラリ。
http://msdn.microsoft.com/en-us/library/dd372349%28VS.85%29.aspx
細かい点で気づいたことをメモ代わりに書いておきます。
1)DrawTextメソッドは文字数に-1を使えない
GDI+のDrawString関数では、文字数に-1を指定するとヌル文字までの文字数を指定したことになりますが、Direct2DのDrawTextメソッドでは_tcslen関数などを使って数えないとダメです。困ったことに-1を指定すると文字が表示されないだけでなくすべての描画が失敗して、クライアント領域が真っ白のままになります。これに気づくまでにかなり時間がかかりました。
2)PathGeometryはBeginFigureしてからAddLines
GDI+のGraphicsPathクラスではAddPolygon関数だけで任意の多角形を作れますが、Direct2DのPathGeometryインターフェースでは、まずBeginFigureメソッドで始点を設定してからAddLinesメソッドなどで頂点を設定し、最後にEndFigureメソッドで閉じなければいけません。
3)Geometryの変形が面倒
あるGeometryをMatrixを使って変形させたいときは、CreateTransformGeometryメソッドを使って新たなTransformGeometryを生成する必要があります。
4)ReftF構造体のメンバがtop、left、bottom、right
GDI+ではx、y、width、heightなので手直しが面倒です。
5)DrawBitmapメソッドではサイズを指定する
ビットマップを描画するDrawBitmapメソッドでは、描画位置の指定が(x, y)ではなく、RectF構造体を使って(left、top、right、bottom)で指定します。そのおかげで拡大縮小は楽なのですが、そのまま描画したいときも(x, y, x+width, y+height)としなければいけないのが面倒。なお、右下座標から1ピクセル引く必要はありません(引くと1ピクセル縮小されてしまう)。
6)行列や色の構造体が2つに分かれている
行列は、D2D1_MATRIX_3X2_F構造体とそれを継承したD2D1名前空間のMatrix32Fクラスに分かれています。Matrix32Fクラスのメンバ関数Rotation、Scale、TranslateはD2D1_MATRIX_3X2_Fを返す静的関数として定義されています。そのため「D2D1_MATRIX_3X2_F mat = D2D1::Matrix32F::Rotation(120.0f);」のような書き方をします。
7)D2D1::ColorFコンストラクタは(UINT RGB, float alpha)
ARGBで指定するコンストラクタはありません。
8)Intelのチップセット内蔵GPUではデバッグ時に不具合あり
Intelのチップセット内蔵GPUでは、デバッグ起動したときにレンダリングターゲットの作成に異様に時間がかかります。なんかミスしているのかと思いましたが、ネット上で同じ障害の情報を見つけました。デバッグなしで起動ならすぐに作成できるので実用上の問題はありませんが……。
Direct2Dは結構いい感じなので、3部作最後の『中級編』で取り上げることを検討しています。
- Newer: DXライブラリ関数リファレンスの制作
- Older: GDI+でどこまでできるか
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://i-libro.net/wpmu/blog/archives/392/trackback
- Listed below are links to weblogs that reference
- Direct2Dは凄い from わくわくプログラミング自習室 Blogs
