Xファイルの甘い罠。巨大Xファイルの読み込みが超遅い
Xファイルは素晴らしいフォーマットです。
初心者が初めて触って理解するためという意味では。
大抵の中級〜上級者曰く。3Dフォーマットは自前フォーマットを用意しろ。
ゲームを作り終わった今、まったくもってその通りだと思います。
電装天使ヴァルフォースのモデルは、Xファイルで出来ています。
色々なツールが対応していること。
ヴァルフォースの制作が初3Dプログラムだったこと。
テキストフォーマットが読みやすかったこと。
これらが採用の理由です。
しかしいくつか弱点があります。
古いフォーマットゆえ、複数のテクスチャUVが設定できないのが最たるものでしょうか。
拡張可能フォーマットなので実際は作れるのですが、そんな特殊なXファイルを出力してくれるツールはまずありません。
そして一番の問題点は、読み込みが超遅いことです。
原因は拡張可能フォーマットであること。
1つ1つのデータの整合性などをきちんとチェックしているからでしょうか。異常に読み込みが遅いのです。
これが顕著になるのは、アニメーションデータを大量に持たせた場合です。
ヴァルフォースのキャラクターは100個程度のAnimationSetを持っていますが、ロード時間は10秒を超えてしまいました。
結局のところ、一度Xファイルとして作成したあと、アニメーションデータ部分だけ切り離して独自のバイナリデータとしました。
内容はID3DXAnimationControllerのアニメーションキー配列のダンプです。
ロード時、モデルのロードは通常通りに行い、ID3DXAnimationControllerは自前で生成。
ダンプデータをアニメーションキーとして登録します。
いっきに生成できるのでとても速く、10秒のロードが1.5秒程度に縮まりました。
(1)注意点としては、ID3DXAnimationControllerに登録されている四元数は反転されているということ。(仕様です)
(2)ID3DXKeyframedAnimationSetの最初もしくは最後のキーを編集した場合は、ID3DXKeyframedAnimationSetごと作り直さないと正しく反映されない。どころかメモリーが破壊されるバグがあること。
(3)静的リンク時代のD3DXは、10MB程度以上のサイズのXファイルを読み込むと高確率でメモリー破壊を起こすこと。
この3つです。
(2)は、ゲームならAnimationKeyはロード時に生成するだけでしょうから問題にならないと思います。
問題になったのはヴァルフォース用にアニメーションエディタを作った時です。えらい目にあいました。
(最初は自分の能力の無さを疑ったのですが、あれは完全にバグです。海外フォーラムでも同様の指摘が少しですがありました)
ソースについてはこちらからどうぞ。
http://yumesoft.net/program.html
余談ですが、黄昏フロンティア様の「ひぐらしデイブレイク」のロードが異様に遅いのは、Xファイルをそのまま使っているからだと思います。違ってたらごめんなさい。