忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

Managed DirectXとXNA

ちょっと最近更新がありませんでしたが、
ゲームを作っていました。

といっても使ったのはXNAではなくManaged DirectXです。

最初はXNAを使って作っていたのですが、
テストプレイヤーの弟達のパソコンが古いんで
動かないんですね・・・・・・。
(盲点でした。)

仕方なくManaged DirectXを使うことにしたのですが、
改めて比較するとXNAより簡単な部分が
それなりにあるように思えます。


まず、BasicEffectなんかのエフェクトを使わなくていいところ、
全てDeviceクラスの操作で描画ができるところです。
同じ描画が複数のクラスにバラけてたら初学者には
わかりにくいかもしれません。
より柔軟にするためのプログラマブル・シェーダが
初学者にとっては「デザインパターンを使ったHello World」
と同じように思えるかもしれません。

もうひとつは、厳密にはこれはManaged DirectXと比べて・・・
という意味ではないのですが、
XNAはデバイスに確保するリソースを
作るタイミングがわかりにくいかもしれません。

Managed DirectXはタイミングは自由でしたが、XNAでは専用の
LoadGraphicsContentメソッドがあり、
その中でロードするように推奨しているように見えます。
で、ここで思うのですが、LoadGraphicsContentメソッドを呼んだ
新しく別にロードしようと思ったらLoadGraphicsContentの外でやることになるわけです。
これでは、正しい方法ではないというような、不安な気持ちにならないでしょうか・・・?

(じゃあどうやってロードするべきなんだという話になりますが、
・・・どうするべきなんでしょう?
例えば、リソースは全て一つのリソースの初期化を表すインターフェースを実装して、
それを何かのコレクションオブジェクトに追加すると
自動的にロードを管理してもらえるとかでしょうか・・・・・・。
これなら確かにイリーガルなロードはなくなりますが、
LoadGraphicsContentの方法よりも
余計に難しいと感じる場合もあるかもしれません。う~ん)


そしてファイルのロードです。
ContentPipelineは確かに柔軟ですが同時に
めんどーなものでもある気がします。
これによってWindowsとXbox360の違いを吸収できますが、
「Windowsでやるんだったら別にやらなくていいんじゃ?」とも心理的に思えます。
「コンピュータサイエンスのいかなる問題も間接層を加えることによって解決できるが、
それによって新たな問題が生じることも多い。」というわけです。
まぁこれは仕方がないので文句を言ってもしょうがありません。

XNAの方が難しいと感じたのはこのくらいで後は簡単になっていると思います。
特にマウスやキーボード、ゲームパッドなんかはかなり簡単になっていると思います。
Managed DirectXのDirectInputは初期化が面倒ですからね。
Keyboard.GetState()ですぐに使えるXNAはとてもすばらしいと思います。

そしてUpdateメソッドを呼ぶタイミングが、XNAでは
1秒に60回に調節されているのもいい感じです。
Managed DirectXで(元はXNAで作った)ゲームを作るとここら辺がおかしくなります。
ゲームの実行環境を変えるとすぐに狂いだすんですね。
スピードが1/3以下になりました。
すぐに1秒に60回の割合でアップデートするように調節しましたが、
XNAではその作業そのものがいらないわけです。

こういうわけで、結論としては
「XNAは分かりやすくなっているところは分かりやすくなっているし、
分かりにくくなっているところは分かりにくくなっている」
といったところでしょうか。
結局何も言っていないような気もしますが。


で、作ったゲームの話ですが、公開しようとは思っているのですが、
もう少し後になると思います。
どうせ公開するならXNAを使った方がいいでしょうし、
まだ問題もありますしね。
他にやらなければいけないこともありますし、夏休みに入った後になると思います。

拍手[0回]

PR