プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
ネームプレート無しユニット多数
測定テスト画面
簡易3Dモデル236体、ビルボードアニメ6000枚をインスタンス無しで表示してみた。さすがに重い。



◎前回の続き

前回コメントでひげねこさんからアドバイスを頂き、タイムルーラーのマーカーグラフ(バー)が高負荷時に表示されない謎が解けました。

UpdateとDrawは必ず対で呼ばれるものと思っていたのですが、条件によるのですね。こちらの記事も大変参考になりました。

ちなみに、メインプログラムのIsFixedTimeStepをfalseにすると、タイムルーラーは正常に表示されますが、移動ユニットはブレて表示されます。固定更新か可変更新か決めて、それに沿ったプログラミングをする必要がありますね。



◎固定?可変?

固定更新と可変更新どちらにすべきか考えたのですが、

○固定更新
・Updateが複数回呼ばれることを考慮した
 プログラミングが必要

○可変更新
・UpdateやDrawが呼ばれるタイミングが変動する
 ことを前提としたプログラミングが必要

開発コストの差はあまり無さそうな気がしますね。それなら、Xbox360に移行しやすい固定更新にしましょう。


残る問題は、固定更新だとタイムルーラーがちらついたり空のバーが表示される現象ですが、皆さんどのように対処しているのでしょうか?

…え?60fpsをキープしてるから問題無い?
こりゃまた失礼しました(爆)

とりあえず、60fps以下の場合はバーを無視して、ログの値のみ記録します。



◎現状パフォーマンス測定

○移動ユニット無し
fps:45.67
Bar 0 Update Avg.:0.02ms
Bar 0 Draw Avg.:17.76ms
Bar 1 mainMap Avg.:4.53ms
Bar 1 mapobjectManager Avg.:12.69ms
Bar 1 unitManager Avg.:0.00ms

○移動ユニットあり
fps:29.95
Bar 0 Update Avg.:2.52ms
Bar 0 Draw Avg.:23.11ms
Bar 1 mainMap Avg.:4.36ms
Bar 1 mapobjectManager Avg.:12.48ms
Bar 1 unitManager Avg.:5.73ms

UpdateよりもDrawがかなり重いですね。その中でも、マップオブジェクトマネージャが半分を占めています。

マップオブジェクトマネージャは静止ユニットを管理するもので、城や柵などの3D簡易モデルと、木のようなビルボードアニメの両タイプを含んでいます。ちなみに、mainMapは地形で、unitManagerは移動ユニットです。

Update+Drawを16.6ms以下にすることが当面の目標ですので、一番重いマップオブジェクトマネージャを重点的に調べましょう。



◎条件変更テスト

城を36→1個にしてみました。

○移動ユニットあり
fps:29.94
Bar 0 Update Avg.:2.44ms
Bar 0 Draw Avg.:16.53ms
Bar 1 mainMap Avg.:4.46ms
Bar 1 mapobjectManager Avg.:5.21ms
Bar 1 unitManager Avg.:6.66ms

城35個で7ms以上かかってました。そんなに重いのか?
もう少し詳しく調べた方が良さそうですね。

それと、CPU側の数値の割に、fpsの数値が低いですね。GPU側にも別のネックがあるのかな?


さらに柵や木を減らして、描画処理時間を測定しました。

城35:7.2ms
柵19:0.7ms
木20×19:4.0ms
城1&柵1&木20×1:0.6ms

同じ簡易モデル方式でも、城と柵でかなり違うので、城特有の処理が重そうです。試しに、ネームプレートを外してみました。

城36、ネームプレートあり:7.85ms、30fps
城36、ネームプレートなし:2.69ms、58fps

うわ、ネームプレートだけでそんなに重かったのか~!
数値で見ると一目了然ですね。

あのネームプレートは、城から外して移動ユニットに付けるつもりだったのですが、このままじゃ使えませんね。とりあえずコメント化して、インスタンシングが終わってから考えます。



◎現状パフォーマンス再測定

ネームプレート無しで、元の条件(城36、柵20、木20×20)で再測定しました。

兵士の数はランダム(1~10人×100部隊)だったので、10人×100部隊で固定しました。木も7種類からランダム選択だったのを1種類に固定しました(数値を安定させるため)。

ネームプレート無し移動ユニットあり01   ネームプレート無し移動ユニットあり02

○移動ユニット無し(カメラ近→遠)
fps:57.07 → 58.95
Bar 0 Update Avg.:0.01 → 0.01ms
Bar 0 Draw Avg.:11.96 → 14.91ms
Bar 1 mainMap Avg.:4.35 → 6.70ms
Bar 1 mapobjectManager Avg.:7.34 → 8.02ms
Bar 1 unitManager Avg.:0.00 → 0.00ms

○移動ユニットあり(カメラ近→遠)
fps:29.94 → 29.94
Bar 0 Update Avg.:2.38 → 2.40ms
Bar 0 Draw Avg.:21.67 → 26.50ms
Bar 1 mainMap Avg.:4.32 → 6.07ms
Bar 1 mapobjectManager Avg.:6.85 → 7.79ms
Bar 1 unitManager Avg.:10.32 → 12.46ms

○マップオブジェクト内訳
城36:2.85ms
柵20:0.65ms
木20×20:5.6ms

兵士の人数がおよそ倍になったので、ユニットマネージャの数値もおよそ倍になりました。この辺はインスタンシングに期待しましょう。

マップオブジェクト内訳の合計値がマップオブジェクトマネージャの数値よりも大きい理由はよくわかりませんが、ループ処理による効率化か誤差でしょう。

現状のパフォーマンスは、こんな感じです。



◎数を増やす

最後に、できればもっと沢山出したいので、数を増やして測定しました。(城36、柵200、木20×200、兵士10×200)

ネームプレート無しユニット多数

○移動ユニット無し(カメラ近→遠)
fps:15.74 → 15.00
Bar 0 Update Avg.:0.01 → 0.01ms
Bar 0 Draw Avg.:52.92 → 63.05ms
Bar 1 mainMap Avg.:4.44 → 6.02ms
Bar 1 mapobjectManager Avg.:48.25 → 56.84ms
Bar 1 unitManager Avg.:0.00 → 0.00ms

○移動ユニットあり(カメラ近→遠)
fps:8.31 → 6.97
Bar 0 Update Avg.:5.09 → 5.01ms
Bar 0 Draw Avg.:72.69 → 88.85ms
Bar 1 mainMap Avg.:4.45 → 6.31ms
Bar 1 mapobjectManager Avg.:47.88 → 57.01ms
Bar 1 unitManager Avg.:20.10 → 25.34ms

さすがに重いですね~。
ビルボードアニメだけで6000枚だし無理もないか。

とりあえずインスタンシングでどこまでいけるか様子を見て、その範囲内でゲームデザインを見直します。



◎次回予告

移動ユニットの有無がfpsに影響するので、そちらに気を取られていたのですが、ネームプレートが予想以上に遅いのは驚きでした。GPU側のデータも取得できると良いのですが、私はVISTA以降のPCを持ってないので無理っぽいです。

とりあえず現状パフォーマンス調査が終わったので、次回はインスタンシング概要調査です。

スポンサーサイト

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

コメント

>固定、可変
可変にすると、負荷が掛かった時スローになって『グラディウス』みたい…というのは置いといて。固定か可変かは本来ゲーム内容で決めるべきな気もします。

最初から可変ならそれでよし、固定の場合でも「やたらと処理落ちして原因を探りたい時だけ、計測のために可変にする」ということで構わないんじゃないでしょうか。本来的には、設定したフレームレートをなるべく割り込まないようにするのが筋な訳ですし。


あと、じつはTimeRulerを表示していること自体も、多少は重くなる原因になっているのではないかと踏んでいます(これは仕方がない)。これを避けるには、計測結果を画面に表示せずに何秒かに1度内部で記録すればいいわけですが、ともかく「実際はTimeRulerの結果より、もう少しいい値になる」ことを念頭においておくとよいのではないかと。

グラ4

>グラディウス
懐かしいですね~w
グラディウス3が出た頃、大学の先輩達がX68Kで独自に(というか勝手に)「グラ4」作ってましたwww

>ゲーム内容で決めるべき
なるほど、処理落ちした時のこととか考えて決めろってことですね。このゲームはセミリアルタイム制にするので、やはり固定更新の方が良さそうです。アドバイスありがとうございました。

>TimeRuler
TimeRulerも同じCPUで動く以上、CPUに負荷を与えていることは間違いありませんが、本文「移動ユニット無し」の「unitManager Avg.」が常に0.00なので、計測値に影響を与えるほどではなさそうです。

コメントの投稿


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

トラックバック


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



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