WPF で DirectX を使うには…というお話です。
実際使えることは確認したのですが、オープンソースにそういうのあるので
そっちを使ったほうがいいよねーという結論に至った訳です。
ゲームは C++ で作りますが、ゲームを制作するツールは C# で作ります。
ツールでパラメータなどを調整して、実際にゲーム画面でどのようになるのかを確かめるという
システムを作りたい場合、C# ツールにゲームループを用意する必要があります。
ここでいう「ゲームループ」とは、ウィンドウの拡大や移動、コントロールへのイベント処理などを邪魔しないで
ゲーム内の計算処理、描画処理を行って描画ループを完成させる機構のことを指します。
前回でWPFの入門編を終わらせたところですが、これができなければまったくお話になりません。
ということで、簡単に調べてみました。
方法はいくつもあるようです。ただし自分が選びたいのは一つだけ。
最もループを高速に行える方法です。
自分が調べた限りでは、次のコードが最も高速なゲームループを実現します。
(コードの内容は、アプリ起動からカウンタを 1,000,000 回インクリメントしたら
メッセージボックスを出すというものです。)
約 40秒ほどして、メッセージボックスが現れました。
つまり、約 0.00004 秒に一回カウンタのインクリメントが行われたということです。
同様のことでお困りの方は、この方法を試してみてはいかがでしょうか?
DirectX を扱うなら C++ です。
C# 用にラッパーも用意されていますが、すべてを C# 側でできるとは限らないようです。
ここは 032話 で作ったような DirectX を簡単に扱えるライブラリを C# からも使えるようにしたいですね。
はい、ということで次の質問に対する答えを探してみましょう。
【質問】 C# から、C++ のライブラリを利用したいです。どうすればよいですか?
【回答】できます。方法は次のページに書かれています。
Creating and Using a Managed Assembly (C++)
ここを読んで簡単に用意できると思いますが、文字列を渡す、又は返す関数をラップする場合に困ると思います。
この問題に対する答えを探したところ、次のページが参考になりました。
文字列変換はよく行うので、この記事を参考に自分も文字列変換便利関数群を用意してみました。
次のファイルは、ラップするときに用意する空の CLR プロジェクトに追加するファイルです。
実装コードを次に示します。(ダブルクリックでコピーします。)
WPFのコードからC++のライブラリへ文字列が渡せること。
C++ライブラリの中で作成した文字列を WPF に渡せること。
上記の動作を確認しました。
今後、C++ ライブラリを C# でラップするときに、このコードを参考に文字列変換してみようと思います。
文字列の受け渡しの問題をクリアできたので 032話 で作った DirectX を簡単に扱えるライブラリを
さっそく C# から使えるようラップしてみようと思います。
まずはウィンドウハンドルを渡して、指定のウィンドウ内を描画対象に…
て、あれ? WPF でウィンドウハンドルってどうやって取得するの?
まぁ、この辺は簡単に調べがつきますね。
SimpleDX10を ラップして、WPF から呼べるようにして
WPF の MainWindow に DirectX のレンダリングを行なってみました。
次にテストコードを示します。
ハイライトした行で MainWindow のウィンドウハンドルを取得しています。
これを SimpleDX のレンダリングターゲットの設定関数に渡しています。
結果を次に示します。
…簡単ですね。
序盤で調べたゲームループで描画関数を定期的に呼び出しています。
さて、ここまでが今回の「C# で DirectX を使用する」の内容です。
ここに来て、C# ってポインタを簡単に使わせてくれないことに気づいたわけですよ。
コードを確認した方は気づいたと思いますが、ウィンドウハンドルを渡す関数のスコープ
unsafe で囲ってますでしょう。これとは別に、プロジェクトのプロパティでも
unsafe コードを使用するにチェックを入れなくてはならんのです。
また、SimpleDX の関数ってよくポインタを引数に取ったり、戻り値で返したりするんですよ。
利用するなら処理自体を C++ で書いて、GUI側から呼び出す形式になるわけで
ラッパー作るのがめんどくさいどころか、同期を保証するシステムを用意するのが難しい。
と、いうことで C# で DirectX, Bullet Physics を扱えるライブラリを探してみることにしました。
もはや、今まで書いてきた C++ は使わない方向です。
(コードを見なおしてみたら、頭おかしいんじゃないかと思ってしまうほど最低なクラス構成だったため…)
で、SharpDX, BulletSharp というものがあるので、どんなものなのか簡単に見てみることにしました。
簡単に触ってみた結果を次回、示してみたいと思います。
お楽しみに!
2012/05/12 初記。
2012/05/19 更新。