x ファイルのパーサーを作成

こんな感じにしようと思う(というか完成してるんだけど)。

x ファイルを実行時に動的に読み込むのは、汎用性がかなり高いんだけど、僕の最終的なターゲットはケータイなので、動的な読み込みは速度的に厳しいかも知れない。

という考え方により、x ファイルから C ソースファイルを生成するコンパイラを作成することにした。あらかじめ実行形式になっていれば、速度の心配はないだろう。

今回は下記で公開されている dosei.x というモデルを使用させてもらった。

x ファイルフォーマット

x ファイルのフォーマットは MSDNX ファイル フォーマット リファレンスという便利なものがあるので、ここで調べる。翻訳がわかりづらい点を除いて、知りたいことはすべてここで調べることができた。

x ファイルは結構読みやすい簡単なフォーマットだった。コンパイラとかパーサーとかを一度でも実装したことがある人なら、簡単に構造を取り出せるだろう。

コンパイル

x ファイルから C ソースファイルにコンパイル。ファイルとしてのサイズはほとんど変わらない。

バイナリにコンパイル

できた C のソースコードをバイナリにコンパイルしてびっくりした。

もともと、サンプルとして使用させてもらった dosei.x は、形状が結構シンプルであるにもかかわらず、メッシュデータは 1MB ぐらいのサイズになる。これをオブジェクトにコンパイルすると、なんと 188MB に膨れ上がる

あいたー、これは想定外だった。

gcc と cl の結果はほぼ同じ。最適化してないけど、しても変わらないだろう。99% がデータなんだし。

一応ケータイ向けを考えているので、この時点でアウト。というか、この方法だと、必要なくなったモデルを解放するという方法が取れない(わけではないけどかなり面倒な)ので、コンパイラではなくローダを作り直すことにしよう。