プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
シェーダーインスタンスのサンプルプロジェクト
サンプルPJ実行画面
GamefestJapan2008Demoの一部を抽出して、解析用のサンプルPJを作成した。



◎カスタムモデルクラス

三国志軍記には「地形モデル」「ビルボードアニメ」「簡易モデル」の3タイプのモデルが登場します。このうち、地形モデルは1つだけですのでインスタンシングは適用しません。「ビルボードアニメ」は前回まででシェーダインスタンスが適用可能となりました。残る課題は「簡易モデルのパフォーマンス向上」です。

簡易モデルは、現状城と柵の2種類だけですが、今後は順次増えていくことでしょう。種類が増えても柔軟に対応できるように、カスタムモデルクラスを導入します。

カスタムモデルクラスは公式サンプルにもありますが、そちらはコメントが英語なので、Gamefest2008デモプログラムを解析して取り込みます。



◎モジュール一覧表

デモPJ(プロジェクト)は、コンテントパイプラインのモジュールだけで16個もあります。私はまだコンテントパイプラインに不慣れで苦手意識が若干あるので、この数を見ただけでちょっと気後れしてしまいます。せめてモジュール一覧表があればいいのに…。

というわけで、適当に作ってみました。

GamefestJapan2008Demo インスタンス関連モジュール一覧表

不要モジュールを削除するか?それとも残して丸ごと取り込むか?少し悩みましたが、結局削除しました。また、7番のモジュール(複数のメッシュ→単一メッシュ)が複数テクスチャに対応してるのか気になりましたが、どうやら対応しているようです。



◎サンプルプロジェクトの作成

サンプルを眺めただけだと、その場は理解した気になっても、いざという時にその知識が思い浮かばず、役に立たないことが往々にしてあります。これは、サンプルを自身のスキルとして消化できていないからです。

サンプルを自らのスキルとして消化するには、部分的に変更して動きを確認したり、自分のプログラムに取り込んだりして、自らの意思で「扱う」ことが重要です。

しかし今回のデモPJは他のデモも含んでいるので、余分な要素が多すぎて扱いにくい状態です。まずは余分な要素をざっと省いて、扱いやすいサンプルPJを作成しましょう。

1.新規PJ作成

2.新規PJ配下にDemoPipelineとDemoTypesWinをコピーし、新規PJに追加する(追加>既存PJ)

3.新規PJの参照設定にDemoTypesの出力DLLを追加する(DemoTypes\bin\x86\Debug\DemoTypes.dll)

4.新規PJのContentの参照設定にDemoPipelineの出力DLLを追加する(DemoPipeline\bin\x86\Debug\DemoPipeline.dll)

5.新規PJにデバッグコンポーネントを追加する

6.新規PJに簡易モデルを追加する

7.簡易モデルのコンテンツプロセッサを「インスタンスモデルプロセッサ」に変更する

8.新規PJにInstancedModel.fxを追加する

9.新規PJにBasic.fxを追加し、ビルドアクションを「なし」とする

10.ビルドしてエラーにならないことを確認する

これで下準備が整いました。あとはGameModelDemo.cs等を参考にしながらプログラムを改修します。



◎透過処理の有効化

「ゲームオブジェクトの描画」の中で、
gd.RenderState.AlphaBlendEnable = false;
と記述されていたので、これをtrueとしたのですが、透過処理はオンになりません。でも、fpsカウンタ等を表示すると透過されます。

実際に透過処理をオンにしているコードを調べたら
spriteBatch.Begin();
でした。レンダーステート初期設定値をこちらで確認しようとしたら、「SpriteStateMode」と記述されていたので少し混乱してしまいました。恐らくバージョン違いか記述ミスによるもので、XNA3.1ではSpriteBlendModeが該当すると思います。

というわけで、アルファブレンド用のレンダーステート初期設定値を追加し、透過処理をオンにしました。ちなみに、ヘルプには「このバージョンのBeginは~」と記述されているので、バージョンによって初期設定値が異なるかもしれません。



◎サンプルプロジェクト

「GamefestJapan2008Demo」から、シェーダインスタンス関連モジュールのみ抽出し、自作モデルに置き換えたサンプルPJです。

シェーダーインスタンスのサンプルプロジェクト

シェーダインスタンスのサンプルプロジェクト(XNA3.1用)

・ゲームパッド/キーボード等の操作無し
・デバッグコンポーネント組込済

元のPJは複数のデモが合体して分かりにくいので、シェーダインスタンスだけ勉強したい人は、こちらの方が分かりやすいと思います。



◎パフォーマンス測定

サンプルPJのパフォーマンスを測定して、UVアニメサンプルと比較してみましょう。

一度に描画するインスタンス数:100個
光源計算:あり

○非アニメモデル:1000個
  メインPC:60fps2.90ms
  サブPC:60fps1.86ms

○非アニメモデル:5000個
  メインPC:59fps13.72ms
  サブPC:30fps26.43ms

○非アニメモデル:10000個
  メインPC:30fps27.26ms
  サブPC:16fps49.72ms

サブPC1000個が妙に早いのは謎ですが、全体的にはUVアニメより1.5~2倍ぐらい遅いですね。非アニメとなったので早くなるかと思ったのに、意外です。

遅くなった要素としては、下記事項が考えられます。

頂点数:4 → 16
プリミティブ数:4 → 10
テクスチャ数:1 → 3



◎実験その1

メタセコイアでテクスチャ割り当てを変更し、減らしてみました。

テクスチャ数:3→1
(他の条件は同一)

○非アニメモデル:1000個
  メインPC:60fps2.63ms
  サブPC:60fps1.01ms

○非アニメモデル:5000個
  メインPC:59fps12.51ms
  サブPC:36fps18.36ms

○非アニメモデル:10000個
  メインPC:30fps24.84ms
  サブPC:21fps36.76ms

メインPCは殆ど誤差の範囲ですが、サブPCは1.3~1.8倍ぐらい変わりました。メインPCだけ差が出なかったので、テクスチャ数は頂点シェーダのパフォーマンスに影響を与えるのかもしれません。



◎実験その2

UVアニメで使用したモデルに差し替えてみました。

頂点数:16→4
プリミティブ数:10→4
テクスチャ数:3→1
(他の条件は同一)

○非アニメモデル:1000個
  メインPC:60fps0.95ms
  サブPC:54fps1.61ms

○非アニメモデル:5000個
  メインPC:59fps4.12ms
  サブPC:18fps7.76ms

○非アニメモデル:10000個
  メインPC:55fps8.21ms
  サブPC:11fps16.08ms

うみゅ!?

モデルがシンプルになって、メインPCのパフォーマンスは2~3倍向上しました。サブPCもCPU時間は短縮されましたが、fpsはサイアクです。

ということは、モデルとGeForce5200FXの相性が悪いってこと?メインPCは逆に相性良さげだなぁ…。



◎実験その3

モデルがシンプルになったのに、サブPCのfpsが低下したのは何故でしょう?もしかして、テクスチャが大きすぎたのでしょうか?

試しに、テクスチャを8×8の小さな画像に差し替えてみました。

サブPCテクスチャ差し替え

○非アニメモデル:1000個
  メインPC:60fps0.97ms
  サブPC:60fps1.03ms

○非アニメモデル:5000個
  メインPC:60fps4.11ms
  サブPC:25fps7.85ms

○非アニメモデル:10000個
  メインPC:59fps8.08ms
  サブPC:15fps16.24ms

多少マシになりましたが、まだ最初の複雑なモデルの方が速いですね。



◎次回予告

結局、サブPCのfpsの謎は解けませんでした。もはや見当も付かないので、謎は保留にして話を先に進めます。

とりあえず解析元のサンプルは準備出来たので、次回はコンテントパイプラインを細かく解析する予定です。

スポンサーサイト

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

コメント

コメントの投稿


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

トラックバック


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



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