プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
デバッグサンプル高負荷時
デバッグサンプル
デバッグに便利なツールが内包されている。タイムルーラーのマーカーは高負荷時に表示されないことがある??



◎はじめに

今回からXNAのモデルインスタンシングに取り組みます。

公式サンプルの機能をそのまま取り込むのが一番の近道かもしれませんが、今回は「何も考えずに強引に組み込む」というのはやりません。

ゲームの大半が出来上がっていて「あとは高速化するだけ」という段階であればそれもアリと思いますが、まだプログラムの大半が未着手ですし、この先やりたいことが沢山あります。強引に組み込んで高速化しても、また遅くなる可能性が高いので、今後に備えてインスタンシングをみっちり勉強するつもりです。



◎導入プロセス

1.既存プログラムのボトルネックを特定する

2.インスタンシングの種類と概要を把握する

3.適用するインスタンシングの種類と
  シェーダーのターゲットバージョンを決める

4.サンプルを解析し、ノウハウを吸収する

5.既存プログラムにインスタンシングを導入する



◎デバッグコマンドのエラー

既存プログラムのボトルネックの特定は、こちらのデバッグツールを利用させて頂きます。

まずサンプルを実行し、デバッグコマンドでhelp、echo、fps等を確認、問題なし。しかしposコマンドを入力すると、エラーになりました。

文字 'イ' (0x30a4) は、この SpriteFont では利用できません。可能な場合は、この文字が含まれるように、フォントの CharacterRegions の範囲を調整してください。

ビルドは通ったのに、フォント関連のエラーが発生しました。念のためConsolasフォントをインストールしたのですが、現象変わらず。

環境が悪いのか?POSコマンドの使い方が悪いのか?
エラーの原因を調べていくと、ちょっと意外なことが判明しました。

[0] = "CMD>pos"
[1] = "Unhandled Exception occured"
[2] = "インデックスが範囲を超えています。(~以下略)

spriteBatch.DrawStringで、上記[2]行目の日本語文字列を表示しようとしてエラーになってました。つまり、エラーの直接原因は「XNA3.1でエラーメッセージが日本語化されたから」でした。

日本語に対応したくても、どのエラーが発生してどの日本語コードが使用されるか予測できないので、対応は不可能です。フォント関連のエラーメッセージに惑わされないよう気を付けましょう。


ところで、デバッグコマンド内でエラー(インデックスが範囲を超えています)が発生した元の原因は、posコマンドの使い方が悪かったからでした(爆)
(誤:pos 10,10、正:pos 10 10)



◎コンポーネントの組み込み

では、メインプログラムにデバッグコンポーネントを追加しましょう。まずファイルをプロジェクトに追加…って、コピーしてnamespace変更でいいのかな?それともプロジェクト参照追加&using指定の方がスマートかな?

デバッグサンプルを確認すると前者のようでしたが、Gamefest2008のデモを確認すると後者のようでした。どっちでもいいから適当にやれってこと?w

結局、ソースモジュールを追加する度にusingを追記するのは面倒な気がするので、前者方式としました。この方式で多数のプロジェクトに組み込むと、コンポーネントのアップデートが大変かもしれませんが、まぁいいかw


それと、こちらの記事で「固定更新から可変更新に変えないと正確なFPS測定ができない」といった感じのことが書かれてますが、これは16.6msよりも細かい値、つまり60fpsを上回る領域をチェックしたい場合の話と解釈しました。
もし間違いでしたら指摘して頂けるとありがたいです。



◎再測定

コンポーネントを組み込んだので様子を見ると、fpsカウンターの値は従来のFrapsと一緒でした。

…いや待て、これまでずっとデバッグモードでビルドしてましたが、測定時はデバッグ無しでビルドしないといけませんね。

移動ユニット無:30 → 45 (fps)
移動ユニット有:20 → 30 (fps)

うわ!?過去の数値と10以上違う!デバッグの有無でFPSこんなに変わるんだったっけ?

ということは、最近の測定データはやり方が間違っていたのですね…ご、ごめんなさい~!_O_


今更かもしれませんが、UVアニメを再測定し、HPにUPしました。

UVアニメーション パフォーマンス測定データ

どの方式も数値が良くなりましたが、全体的な傾向はあまり変わってないようですね。やっぱり、シェーダー改修方式が一番早そうだなぁ…。

2000枚前後で何かがネックになってるようで気になりますが、詳しく調べて高速化を図るなら、サンプルよりもメインプログラムを対象とすべきですね。



◎タイムルーラーで測定

本題に戻って、メインプログラムの現状パフォーマンス調査再開。どの個所がネックになっているのか、タイムルーラーで測定します。

移動ユニット無現状パフォーマンス   移動ユニット有現状パフォーマンス

○移動ユニット無し
fps:45
Update Avg.:0.02ms
Draw Avg.:17.45ms

○移動ユニットあり
fps:30
Update Avg.:2.74ms
Draw Avg.:22.70ms

数値よりもバー(青色がUpdate、黄色がDraw)が気になったのですが、移動ユニット有りの方に黄色バーが見当たりません。数値が大きすぎると表示されないものなのでしょうか?


とりあえずマップ/静止ユニット/移動ユニットの3描画処理をマークすると、バーが2本表示される正しい画面と、空のバーが1本表示される正しくない画面が、瞬間的に交互に表示されて画面がチラつきました。

バーが2本表示された瞬間   バーが空白になった瞬間

どうも様子がおかしいので、Draw内の処理を全てコメント化したら、10秒に一回ぐらいの間隔でバーが空になる瞬間がありました。draw内の処理が増えると、バーが空になる瞬間が増えるようです。

コンポーネントの組み込みに失敗したのかなぁ…。



◎再現テスト

試しに、デバッグサンプルのDraw()の最後「timerRuler.EndMark("Draw");」の直前に
timerRuler.BeginMark(1, "dummy", Color.Red);
timerRuler.EndMark(1, "dummy");

と入れてバーを2行にしたら(視覚的にわかりやすくするため)、先程と同じく、バーが空になる(正確に言うと値が1になる)瞬間がありました。さらに、他のタスクを起動してデバッグサンプルを非アクティブにすると、恒常的に再現しました。

ちなみに、デバッグサンプルを改修しない場合は、黄色いバーが表示されない現象が再現します。

デバッグサンプルで再現したので、組み込みに失敗したわけではなさそうです。

コンポーネントを解析すると、前フレームのログのマークカウントが1になるタイミングがありました。この瞬間に、空のバーが1本の画面が表示されたわけです。

しかし、高負荷時にマークカウントが1になる理由が分かりません。やっぱりPC環境の特性なのかと思い、試しにサブPC(GeForceFX5200)で実行すると…再現しました。

PC環境に依存しないってことは、コンポーネントの仕様ってこと?!



◎次回予告

マーカーグラフは、高負荷時に振り切れる様子を確認して、そうならないように調整するための目安と思いますが、高負荷時に表示されないのはおかしな話です。

測定ミスが発覚したばかりなので、不安は払拭したかったのですが、仕方ないですね。マーカーグラフを無視してログの数値だけ追いかけます。

というわけで、次回はパフォーマンス測定の続き&インスタンシング概要調査です。

スポンサーサイト

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

コメント

IsFixedTimeStepにtrueを設定していて、処理落ちが発生している場合、Updateが複数回呼ばれます。この場合、TimeRuler.StartFrameも複数回呼ばれてしまうのがDraw部分のバーが表示されない原因だと思われます。

IsFixedTimeStepをfalseにしてみてください。

参考URL
http://blogs.msdn.com/ito/archive/2007/03/08/2-update.aspx

アドバイスありがとうございます

>IsFixedTimeStepをfalseにしてみてください。
仰る通り、Draw部分のバーが正常に表示されました。なるほど、Updateが複数回呼ばれていたのですね。

>参考URL
UpdateとDrawは必ず対で呼ばれるものと思っていたので、大変勉強になりました。どうもありがとうございました!

コメントの投稿


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

トラックバック


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



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