Direct2D と DirectWrite のメモ的な話

最近何かと Windows プラットフォームでのプログラミングに回帰してる。
色んなところで新たに繋がるポイントが C# やら Windows タブレットやらってところに広がってくのな。
まあ、このタイトルでテクニカルなブログ書いてて、自身が C++ のアプリケーション屋なんで、未来が過去の延長線上にあるなら、そこに引力が発生しても何の不思議も無い。

興味のある分野の情報がどんどん集まるのってなんて法則やったっけ?忘れた。カラーバス効果でも良いんかな?

ちょっと前に Windows で低レベルな APIレンダリングする場合にどうするかってな話を質問されたことがあってんけど、これまで自分で作ったアプリケーションは概ね GDI/GDI+ の Windows API からメモリ上のデバイスコンテキストに描画してビットマップ転送するダブルバッファみたいなことしかやってなかったので、知識としてもってた引き出しからハードウェアアクセラレーションに期待するような仕組みであれば Direct3Dテクスチャマッピングみたいな手法で2D描画すると思うと答えた。

ただし、今のマシンだとビデオカードのメモリの読み書きも高速で帯域も広いんで、単純な描画だと GDI でも問題ないかも知れないってなことをもうちょっと平易な言い回しで補足した。実際に DirectDraw の時代にソフトウェアレンダリングピクセルフィルレートの遅さと戦いながらメガデモ作ってたような人なら今のヌルい 2D 描画は恵まれすぎてると思うんじゃ無いかなあ。

で、実際に最新の Windows API での 2D 描画事情ってどうなってんのか?って疑問に思って調べてみたら、結構進化してた。
実はこの前大阪で開催された初心者向けの Visual Studio 勉強会に参加した時に id:posaunehm さんの LT で WPF のデモしてくれたのな。
そんなかで、Direct3D の Pixel shader を使ったようなエフェクトを WPF でやってみるみたいのがあって(API のレイヤー階層理解してないんで、どういう構造かは解ってませんが)ハードウェアアクセラレーション前提っぽいなと思ったのでした。

そんな前提条件の中で google ってみたら、Direct2D と DirectWrite なんて用語が!
詳しく見てないけど .NET Framework に対して中立ってことなのか、いわゆるアンマネージドな C++ 呼ぶ COM のインターフェースらしい。サンプルもやはり C++ で書いてある。
きっと理由はあるんやろけど、イマドキの C# プログラマーが COM インターフェースのみならず Win32 API で GDI を併用しながら C++ で書く?
と言うか学習コストとリターンを考えたらコストパフォーマンス悪すぎだよなあ。C++ って時点でかなりなのに。

こういうところマイクロソフトがどう考えてんのか気になるとこだよね。レガシーな C++ プログラマの雇用を支えてるとか、ペンネーム C++ 大好きっこさんを大量に社内に抱えてるとかなら、ちょっと恰好良いなって思うけど。

趣味で書くんなら、90年代にタイムスリップした気分で old school なトンネルエフェクトとかレガシーなファイヤーエフェクトとか書いてみても良いかもね。WindowsC++ プログラマならあの頃のソフトウェアレンダリングを懐かしむ人もまだいるんじゃないのかなあ。

現実的には Direct2D よりハードウェアアクセラレーションのきいたフォント描画の DirectWrite の方が使い道ありそうやけどね。