フリーゲーム・フリーソフトの開発過程を記録していく、TDtechnic公式ブログです。製品はカテゴリの「ダウンロード場」からダウンロードして頂けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

こんにちは。今回は大躍進です。なんと描画負荷をおよそ1/4にすることに成功しました。

事の発端はステージ作りです。デスクなどを配置している最中だったのですが、十数個ほど並べただけで1Fの頂点数が約44000となり、ソフトウェア頂点処理とはいえ、そこそこ性能の良い私のPCでもカクつくという状態になってしまいました。

こいつでカクつくなら、ちょっと古めのPCならもっとカクつくでしょう。TDtechnicは動作環境の多さを売りにしているのに、要求スペックをそんなに上げるわけにはいきません。

まずやったのは、モデルの簡素化です。デスク一つ当たり約1300頂点あったのを、涙をのんで削減して約550にまでしました。全体ではおよそ18000にまで減少され、かなりマシになりました。ところが!これでもまだ、私のPCでカクつくのです(50FPS程度)!つまり今の描画ルーチンでは、ステージを18000頂点以下で作らないといけないというのですか?ステージ製作は始まったばかりですから、それは困ります。どうやら根本的に描画速度を上げる必要があるようです。

高速化の心当たりとしてはソフトウェア頂点処理をハードウェア頂点処理にすることがあります。普通はハードウェアにするんですが、私はスキンメッシュを固定機能で実装しているためそれが出来ません。ここの差はかなり大きいです(実際、スキンメッシュのないモデルで比べてみると違いは歴然です…)。とうとう固定機能を諦め、プログラマブルシェーダに移行する時が来たのかもしれません。

とりあえず、準備としてD3DXMeshを使ってみることにしました。これを使いたかった訳は、ハードウェアのメモリ容量に関わる分割アルゴリズムを考えたくなかったからです(笑)。要するにハードウェアにはいっぺんに全部の情報を置けないため、プログラマブルシェーダでやる場合、うまいこと幾つかに分けて描画する必要があるのですが、この「うまいこと」が難しいのです。ここはMicrosoftが作ってくれたConvertToIndexedBlendedMeshという関数を利用しましょう。まずはD3DXMeshを作ってみて、まだ分割は使わないで固定機能で描画して、おお、出来ました。カクカクですがちゃんとアニメーションもできています。次にConvertToIndexedBlendedMeshで分割して、やっぱり固定機能で描画して、…おお!?

なんということでしょう。分割を適用したところ、固定機能のままで200FPS出ました。もちろんソフトウェア頂点処理です。どうやら、分割によってメッシュ自体がかなり最適化され、根本的な効率が上がったようです。1ループが食う時間の殆どは描画時間ですから、およそ1/4の時間で描画できていることになります。逆に言えば、今の3倍くらいの頂点になってもちゃんと60FPSで描画できる…ってことですよね!たぶん。

というわけで、今回はプログラマブルシェーダに移行しないで済みました。まあここまで来たら挑戦してみたい気持ちもありますが、まだわかりません。ところで、D3DXMeshを利用すると再びD3DXのインストールが必要なように思われますが、そのようなことはありません。実はConvertToIndexedBlendedMeshは、PMDファイルを自作形式のモデルデータに変換するプログラムの中で使うだけで、モデルデータにD3DX依存のデータは一切含まれませんので、不死女本体はD3DX非依存のままです。今後も素のDirectX一本でプレイしていただけます。

<本日のスクリーンショット>
たまにはスクリーンショットを上げましょうかね。今回晴れて描画できるようになったデスク群です。もちろんこれだけでなくもっと色々置かねばならないので、描画速度との戦いはまだまだ続きますがね。
desks.jpg
関連記事

[2014/12/28 12:26] | 不死女 -Immortal girl-
|
コメント:
この記事へのコメント:
コメント:を投稿
URL:

パスワード:
非公開コメント: 管理者にだけ表示を許可
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。