2011年3月11日金曜日

SlimDXでDirect2Dの問題点

SlimDXのDirect2Dの講座的なものを書いてきましたが。今更ながら分かったことがあります。

SlimDXのDirect2Dは現状使い物にならない!

細かい問題点は色々とあったのですが、重要なことが1つ。今のバージョン(June 2010)ではDirect2Dの一部機能を使えません。
そのことを含めてSlimDXのDirect2Dの問題点を列挙したいと思います。そして最後に代替となるDirect2Dライブラリを示したいと思います。



SlimDXのDirect2Dの問題点

私が今のところ気づいた点を書いておきます。

・名前の衝突が激しい
SlimDXではDirect2D以外にもDirectWriteやらDirect3Dやらその他もろもろやらが入っています。で、そこでとにかく名前が被ります。FactoryやらDeviceやらがいっぱいあります。どうやらエイリアス参照で使われることを想定しているようです。つまり、参照するときはこんな風にするべきです。
using SlimDX;
using D2D = SlimDX.Direct2D;
using DW = SlimDX.DirectWrite;
using D3D10 = SlimDX.Direct3D10;
using DXGI = SlimDX.DXGI;
こうしておかないと後々名前の衝突が激しくってやってられなくなります。私と周りの人間関係のようです。
Direct2Dだけを使うなら大丈夫じゃないかと思っていたのですが、やっかいなのはDirect2DはSystem.Drawing名前空間の構造体を多用しているのです。SizeやらPointFやらです。そのため、Direct2DではSystem.Drawing名前空間への参照を加えないといけないのですが……SlimDX.Direct2D名前空間とSystem.Drawing名前空間との間でBitmapという名前が衝突しています。




・Matrix構造体がしょぼい
SlimDXのDirect2DではMatrix3x2構造体というのがあります。これを使って座標変換をします。頻繁に使う構造体であります。しかし、これ、変換行列を簡単に作ることができません。何行何列を10にするとか0.0にするとか自分で指定してやらないといけません。せめて平行移動くらいは簡単に作れるようにして欲しかったです。


・WICに対応していない
これが重大な問題です。本場のDirect2DはWICで画像ファイルの読み込みと書き込みができるようになっているのですが、SlimDXバージョンはこれができません。読み込みについては前に書いたようになんとかできるのですが、書き込みはできません。
Direct3D10とサーフェイスの共有とか、デバイスコンテキスト経由だったらもしかしたらふんにゃらひょおはんみりせ。


とまあ、途中で書くのが面倒になったのですがSlimDXは画像ファイルの書き込みができないと、そういうことです。君には失望したよ。

もういっそのことDllImportでDirect2Dを直で使うか自分でライブラリを作ろうかなと思っていました。
しかし!そんなことしなくてもSlimDX以外にDirect2Dを使う方法があったのです。どうして今まで知らなかったのだ。

Windows® API Code Pack for Microsoft® .NET Framework

なんだぁ、マイクロソフトさんManaged DirectXの開発は終わったとか聞いてたけどちゃっかり別の形で作っちゃってるじゃないですか。SlimDXはダメ子さんだったぞ☆

ちょっと使ってみた感想として、リファレンスが読みにくい。

どうもこれ、SlimDXに比べて薄いラッパライブラリのようです。そのため元のDirect2Dのリファレンスがそのまんま使えます。
ただし、使いやすいとは決して言えません。SlimDXでは既定値(デフォルト)が存在する引数は省略できるように設計されていましたが、こいつはできません。デフォルトが0だったら0を渡してやらないといけません。そのため、Hellow Worldプログラムが結構ややこしくなります。

そして、WICを独自に実装しています。
Microsoft.WindowsAPICodePack.DirectX.WindowsImagingComponent名前空間です。WICはWPFのSystem.Windows.Media.Imaging名前空間でも実装されていましたから、え?という感じです。両者の間で互換性はあるのかね。無いようですね。ということはDirect2Dで描いたものをWPFで表示させたいならDirect2D→WIC→binary→WIC→WPFとするしかないと。なんじゃそりゃ。せめてDirect2Dから直接バイナリを出力できれば良いんだけど……。こういうこともあってSlimDXではWICを実装していないのかもしれませんね。
いやね、Direct2DとWPFの連携が難しそうだからDirect2Dでビットマップに描いてそれをWPFの画面に表示しようと思ってたんですよ。←それなら最初からWPFで描け

0 件のコメント:

コメントを投稿