プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
画像統合後01
開発中のメイン画面
槍兵以外の画像を前回方式に置き換えた。画面内の画像数が一定量を超えると大幅に遅延するようだ。



◎連画の統合

今回は既存オブジェクトの画像を統合し、前回方式で実装します。

まずは連画取得ツールに画像統合機能を組み込みます。実はまだやってなかったのですが(汗)、組み込み前提でプログラム作成済なので、問題なく組み込めました。

連画取得から統合画像まで一発で出力できるようになったので、とても快適です。順次出力しましょう。

SpearMan01_WalkLoop01

槍兵歩行ループモーションを出力したら、こんな感じになりました。無駄な隙間が多くて勿体ない気がしますね。

歩行モーションだけ解像度を上げて隙間を減らすことも可能ですが、モーションによって解像度が変わると見た目に違和感が生じるので、このまま採用します。

しかしそう考えると、最も連画数が多いモーションに解像度を合わせる必要がありますね。槍騎兵も隙間が多いのですが、とりあえず槍兵の解像度に合わせました。木の解像度は高めにしました。



◎実装

画像が準備出来たので、前回方式で実装しました。

槍騎兵画像統合後   木画像統合後01

槍騎兵や槍兵歩行モーションなどは問題なく実装できました。パフォーマンスは以前と同等です。

問題は木です。映像的には問題無さそうですが、これが視界に入るとパフォーマンスが大幅に低下します(30→5fps)。基盤クラスは兵士と共通なのに、何故木だけこのような状態になるのでしょうか?



◎原因調査

いろいろ試していたら、ちょっと不可解な現象を確認しました。

木連画統合fps低下原因調査01   木連画統合fps低下原因調査02

左から右にわずかにスクロールしただけで、40→7fpsまで低下しました。木の種類や本数を変えたりして似たようなパターンが発生しないか試したら、問題点が徐々に浮き彫りになってきました。

木の登録本数が増えるとパフォーマンスが低下しますが、これは以前と全く同じレベルでした。これは画面に表示された本数とは無関係で、ゲーム全体の登録本数に影響します。(400本(&その他モデル)で30fps程度)

問題は、画面上に木が5種類以上表示されると、パフォーマンスが一気に低下する、ということです。

この「テクスチャ数が4以下だと早い」というのは心当たりがあります。昔書いた記事を読み返すと…あれ?この時は「キャッシュ」と結論付けてますね。う~ん…。

でも、「4以下は早い」というのは過去に度々経験したので、ちょっと引っ掛かります。試しに、木の本数を以前と同数に戻して、木の種類を7→4に変更してみました。

木を4種類とした

以前と同じ30fosに戻りました!やはり4という数字がポイントなのかな?(不明)

ちなみに、画面内の本数が20本でも60本でも、ズームアップして拡大してもfpsは殆ど変わりません。



◎テクスチャ切り替え遅延

ところが、木を4種類以下に抑えても、移動ユニットを表示すると遅延現象が発生しました。

木と移動ユニットが表示されると遅延現象発生

ユニット/モデル/テクスチャの関係は以下の通りです。

槍兵 :板ポリA:3モーション(3画像)
槍騎兵:板ポリA:1モーション(1画像)
木  :板ポリB:4種類(4画像)

画面内に表示されているユニット
・槍兵と槍騎兵のみ:遅延現象なし
・木と槍騎兵のみ:遅延現象なし
・木と槍兵のみ:遅延現象発生
・木と槍騎兵と槍兵:遅延現象発生

槍兵のモーションを切り替えると、切り替え中に遅延が発生し、切り替えが終わって1モーションになると遅延しなくなります。

どうやら、カスタムBasicEffectで画面内に描画するテクスチャの総数が4~5あたりが境目のようです。(モデルは無関係?)


一つ腑に落ちないのは「以前のテクスチャ差し替え方式は遅延しなかった」ということです。もしや、無意識のうちにマテリアルバッチを適用していたのでは?

…と思って以前のソースを確認したのですが、ModelMesh.Drawで普通に表示してるだけでした。以前のソースにマテリアルバッチを適用したら早くなるのかなぁ?(謎)



◎エフェクト情報の中身

以前と今回のソースを比較して、1つ気付いたことがあります。

以前のソースでは、Content.Load時に、各ModelMeshPart.Effectに固有のエフェクト情報を所持している。
今回のソースでは、Content.Load時に、(2回目以降も)同じエフェクト情報(アドレス)を示している。

ということです。読みだしたエフェクト情報を格納するフィールドはインスタンス毎に保持しているのですが、中身が同じアドレスだと意味無いですねw



◎エフェクト情報の複製

エフェクトファイルのLoad時に複製すべく、カスタムコンテントマネージャで呼び出したら、OutOfMemoryで落ちました。

カスタムコンテントマネージャって、メモリ効率悪いのかなぁ…いやそれ以前に、エフェクトファイルを何百回も呼び出す方が無謀か?(爆)

とりあえずエフェクトを複製したくて
Effect ef = content.Load("MyBasicEffect");
myEffect = ef.Clone(this.unit.GetGraphicsDevice());

としたら、エラーにはなりませんが、何も表示されなくなりました。そこでdraw()内に
myEffect.CommitChanges();
を追加したら、木と槍騎兵がそれぞれ1つだけ表示されました。どうやら、2回目以降に読み込んだエフェクトを.Cloneでコピーしても、無視されるようですね。



◎テクスチャ切り替えのタイミング

というわけで、テクスチャ1~4枚につき1つのエフェクトファイルを用意するよう改修しました。中身の値は全部一緒なので無駄な気がしますが、クローンを何百個もコピーするよりはマシなので、当面は良しとします。

しかし、実際に動かしてみると、遅延現象が発生しました。Draw()内で毎回テクスチャ切り替えすると遅くなるようなので、初期設定とモーション変更時のみテクスチャを切り替えるようにします。

木が2種類になった

遅延現象は発生しなくなりましたが、木が2種類になってしまいました。これは、1~4番の木と5~7番の木でエフェクトファイルを共有させたためです。

そこで、エフェクトファイルを7個別々に用意したら、5種類目から遅延現象が発生しました。



◎モデル情報の中身

改めて考えると、木の板ポリモデルは7種類共通で、Content.Loadで読み込んだ板ポリインスタンスも全部同じ情報(アドレス)を示しているわけです。ということは、各板ポリインスタンスに個別のエフェクト情報を渡しても、最後に設定したエフェクト以外は無効ってことじゃないですか?

試しに、Draw()内の
ModelMeshPart.Effect = myEffect[~]
をコメント化したら、木が1種類だけ表示されました。

木が1種類だけ表示された

木は20本あるはずですが、他の6種類が表示されません。やはり、最後に設定したエフェクト以外は無効なんですね。



◎結果

1テクスチャにつき1モデル1エフェクト用意して実装したら、「◎テクスチャ切り替え遅延」と同じ状態になりました。

ガーン!!

結局、「◎エフェクト情報の中身」以降は見当違いで無意味だったようです…(>_<)



◎次回予告

遅延現象はモデルインスタンシングで解消できるかもしれないし、いざとなったら元の方式に戻せば良いので、どうにもならないという状態ではありませんが、遅延原因不明のままインスタンシングを適用して良いのか迷ってます。

・遅延原因調査の続き
・モデルインスタンシングの下調べ
・いきなりマテリアルバッチ適用

次回は上記の三択で考えています。さてどれになるやら?w

スポンサーサイト

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

コメント

テクスチャが5枚の場合を4枚の場合と比較したら125%の負荷になっている、というようなものじゃないですね。経験的に、ある一線を越えたらガクッと落ちます。特にテクスチャやエフェクトがGPUメモリに収まりきらなくてスワップが発生してるとか、いかにもありそう。

お節介なのですが、やはりGameDebugライブラリを導入された方がよくないですか。今のままだと、遅延の原因がCPUの側なのかGPUなのか切り分け出来ないので…。

以前より負荷が増えた理由が知りたいです

>125%の負荷
100%以下は一定の速度で、100%を超えると急に遅くなるということですね?

>ある一線を越えたらガクッと落ちます。
そうですね。私も度々経験しました。

>スワップが発生
その可能性はあると思いますが、だとすると以前の方式でスワップが発生しなかったのは、1枚あたりのテクスチャ解像度が増えたからですかね?

>GameDebugライブラリ
切り分けが進むかもしれないとのことですので、試してみます。ありがとうございました。

遅延原因判明しました!

遅延原因は「1枚あたりのテクスチャ解像度が増えたから」でした(詳細は次回)。

これで心おきなくインスタンシングに進めそうです。
どうもありがとうございました!

コメントの投稿


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

トラックバック


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



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