プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
全モデルシェーダーインスタンス化
開発中のメイン画面
シェーダーインスタンスモデルのUVアニメ化に成功し、ついに全モデルをシェーダーインスタンス化。パフォーマンスが大幅に向上し、木も7種類に復活した。



◎再生モーション毎のリスト

前回の続きです。槍兵シェーダーインスタンスモデルのUVアニメ化を行います。

槍兵にはモーションが複数ありますが、画像ファイルはモーション毎に異なるので、モーション変更時は画像を差し替える必要があります。一方、シェーダーインスタンスは同一のマテリアルを一括描画するものです。よって、槍兵は再生モーションの種類毎にまとめて一括描画する必要があります。

この「再生モーションの種類毎にまとめる」という手順は、通常以下のようになります。

例:槍兵Aを歩行させる場合

1.歩行開始モーションのリストに槍兵Aを追加する
2.歩行開始モーションを再生する(1~2秒)
3.歩行開始モーションのリストから槍兵Aを削除する
4.歩行ループモーションのリストに槍兵Aを追加する
5.歩行ループモーションを再生する

この例を見て、カンの良い方はピンと来たかもしれませんが、再生モーションはゲーム中頻繁に変更される可能性があります。つまり、リストの追加削除が頻繁に発生し、ガーベージコレクションによる遅延が発生するリスクが高くなる、ということです。
(以上、A案と呼びます)



◎回避策の検討

この問題の回避策は2つ考えられます。

1つは、リストを常時保持せずに、毎フレーム新規作成&再構築する、というものです。(槍兵全体リストから、再生モーション番号で検索抽出してリストを構築する)

この方法であれば、画質を落とさずにガーベージコレクション発生リスクを回避できます。しかし、リストを毎フレーム再構築するので、常に高負荷状態となる可能性があります。
(以上、B案と呼びます)

もう1つは、(フレーム数を減らして)全画像を1枚に収めてしまう、というものです。しかしこれでは初代ドラクエのような数フレームの「パタパタアニメ」程度しか出来なくなってしまいます。
(以上、C案と呼びます)


まずC案は極力避けたいので、AB案が両方ダメだった場合の最終案とします。

残るはA案B案ですが、とりあえずリスクが少ないB案でやってみて、パフォーマンスに問題があれば再度検討しましょう。



◎ジェネリッククラス

一応B案で進めることにしましたが、場合によってはA案に変更する可能性もあります。より柔軟に対応できるように、前回コメントでyohさんが挙げていた「描画ロジックそのものと描画対象リストをワンセットで新しい単独のクラスとする方法」に移行することにしました。

このクラスはジェネリックリストを基底クラスとした方が都合が良いので、ますは下記のように新規クラスを作成し、

class ShaderInstanceDraw : System.Collections.Generic.List{ }

こちらの記事を参考にしながらメソッドを追加して、B案のジェネリッククラスを記述しました。

槍兵リストを再生モーション番号毎に分けてシェーダーインスタンスで表示

移行作業が完了し、柵モデルと槍兵モデルは新規クラスで無事に描画できました。B案の実装も完了し、槍兵のインスタンスはモーション番号毎に異なるリストに振り分けてから通常のシェーダインスタンスで描画する所まで出来ました。



◎カスタムモデルクラスを使用したサンプル

さて、いよいよ槍兵モデルのUVアニメ化ですが、実はカスタムモデルクラスを使用したUVアニメサンプルを作成してなかったので、どこをどう改修すれば良いのかいまいち確信が持てません。

とりあえず適当に改修すると、槍兵モデルが1体だけ表示されました。う~ん…やはり1度サンプルを作って確認した方がいいかな?

というわけで、サンプルを作成してこちらに追加しました。

カスタムモデル版シェーダーインスタンスUVアニメサンプル

以前のカスタムモデルクラス不使用版と比べると、インスタンスの複製コード等がパイプラインやライブラリに記述されているので、本体のプログラムがすっきりしています。

但し、このカスタムモデル版には注意事項があって、モデリングツール等で予め板ポリモデル4頂点のUV設定を‘フレーム1枚あたりの解像度’に合わせておく必要があります。

また、‘フレーム1枚あたりの解像度’が異なるアニメモデルを追加する場合、以前は本体側のプログラム改修で対応可能でしたが、今回は板ポリモデルをその都度追加する必要があります。(パイプライン内でインスタンスの複製まで行っているので、コードで柔軟に対応することはできません)



◎オチ

サンプルは問題無く動くのに、何故本番プログラムは上手くいかないのでしょうか?

シラミ潰しにチェックすると、コピペした時に変数名を書き換えていない箇所がありました。

…わざわざサンプルまで作ったのに、実はただの凡ミスというオチでした(爆)

柵&槍兵シェーダーインスタンス化完了

やりました!

静止画ですが、槍兵はシェーダーインスタンス&UVアニメでちゃんと動きます。これだけ出して28fpsですから、着実にパフォーマンス向上してますね^^

第三段階完了です!



◎第四段階

第四段階は、残りのモデル(木、城、槍騎兵)を全てシェーダーインスタンス化します。木は

・木の種類はテクスチャの割り当てで表現していたが、
 モーションの1種として表現する

・フレーム1枚当たりの解像度が異なるので、
 別の板ポリを用意する

などを行いましたが、城と槍騎兵はさしたる問題も無く順当にインスタンス化できました。



木が邪魔で見えにくいかもしれませんが、ユニットは1000体、木は2000本、柵は200個、城は36個出しています。(久々に木が7種類に復活したので、嬉しくて植え過ぎちゃいましたw)

いや~以前は木の種類を増やしただけで重くて動きませんでしたが、今は動画取得中でもこれぐらいのパフォーマンスが出るようになりました。

ついでに言うと、ビルド時間や画像読み込み時間も数十分の1に短縮されました。(UVアニメが成功するまで連画を残していたので、時間かかってました)



◎次回予告

長かったシェーダーインスタンスシリーズも、今回でめでたく終了です。これでようやく次の段階に進めそうですね(^^)

4月になったので、次回は「3月の総括と4月の目標」です。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。