プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
槍兵画像統合後03
開発中のメイン画面
UVアニメの実装方式を変更して、前々回のパフォーマンスレベルまで回復させた。



◎シェーダー改修

今回はシェーダーを改修して、以前の速度に戻るか試してみます。

まず、メタセコイアで板ポリのUV設定を画像1枚分に調整します。
メタセコイアで板ポリのUV設定を画像1枚分に調整

次に、BasicEffectカスタマイズサンプルにアニメテクスチャ左上座標計算を追加し、座標をBasicEffect.fxに渡します。
Vector2 TexCoord1 = new Vector2(tx1, ty1);
myEffect.Parameters["TexCoord1"].SetValue(TexCoord1);


最後に、BasicEffect.fxのテクスチャ座標設定を書き換えます。
// vout.TexCoord = vin.TexCoord;
vout.TexCoord = vin.TexCoord + TexCoord1;


シェーダー改修による頂点データの動的変更

動きました!
見た目は以前のサンプルと全く一緒ですが、今回はModelMesh.Drawによる表示ですので、頂点バッファやインデックスバッファが使用されて前回の方式よりも早くなった(以前のパフォーマンスに戻った)はずです。



◎パフォーマンス計測

前回の表示方式と今回の表示方式で、パフォーマンスがどの程度違うか計測しました。

板ポリアニメ大量表示テスト(シェーダー改修方式100枚)   板ポリアニメ大量表示テスト(シェーダー改修方式1000枚)
板ポリアニメ100枚(左図)、同1000枚(右図)

       前回方式 → 今回方式
板ポリアニメ 100枚:60 → 60(fps)
板ポリアニメ1000枚:59 → 59(fps)
板ポリアニメ1500枚:30 → 40(fps)
板ポリアニメ2000枚:30 → 30(fps)
板ポリアニメ3000枚:20 → 20(fps)
板ポリアニメ5000枚:12 → 15(fps)



2/14追記
この計測データはデバッグ付きで実行したものです。
デバッグ無しで計測したデータはこちら



1500枚と5000枚以外のfpsは一緒でした。
エーッ!?何で?理解できない…(>_<)

前回方式もバッファは使用されていたということでしょうか?
それとも、両方式共にバッファは使用されていないということでしょうか?

1500枚の時だけ10fps差が出る理由もよくわかりません。
プログラムや計測方法がどこか間違っているのでしょうか?



◎実装

この様子だと、実装してもパフォーマンスは変わらないかもしれませんが、一応試してみます。

槍兵画像統合後04

前々回まで:20fps
前回方式実装後:12fps
今回方式実装後:20fps

前回の方式よりも早くなった…というか、以前のパフォーマンスに戻りました。

最初の予想通りの結果になったわけですが、逆にパフォーマンス計測テストの結果と合わないような気がします。前回方式は1500枚の時に10fps低下しているので、それと似たような現象が発生してたのかなぁ?



◎サンプルプロジェクト

今回の方式をHPにまとめてUPしました。

XNA3.1でUVアニメーション(シェーダー改修方式)

メインプログラムはわりとシンプルですし、少なくとも前回方式よりは早いので、こちらの方をお勧めします。



◎次回予告

今回の目標(以前のパフォーマンスに戻す)は達成したものの、いまいち釈然としませんね。

パフォーマンス向上への道を踏み外していない自信はありますが、パフォーマンス計測の自信はちょっと揺らいできました。今後モデルインスタンシング適用時は計測が重要なんだけどなぁ…。

とりあえず次回は槍兵以外の既存オブジェクト画像を統合し、今回と同じ方式にします。

スポンサーサイト

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

コメント

最近諦めてインスタンシングモデルを導入した手前
記事内容が気になったので掲載されているサンプルプロジェクトをXbox360で試してみました。

そして、ついでに自前BasicEffectインスタンシング版適用で
性能の前後比較までやってみましたw

<結果>
1000枚 22 → 60fps
2000枚 11 → 30~38fps
3000枚 7 → 30fps
4000枚 5.5 → 20fps
5000枚 4.4 → 18 fps
8000枚 2.8 → 12 fps

ちなみに画面サイズは 1280x720 に変更した上です。
FPS計測はひにけにXNAさんところにあるDebugSampleのを利用しました。
思ったより効果が出なかったんですが、
アニメーションの更新とかその辺にネックでたのかな?

ご参考:公式のインスタンシングサンプル
http://creators.xna.com/ja-jp/sample/meshinstancing

余談ですがウチのPCだと適用前で
5000枚 28fpsぐらいでました PC強えぇ
・Win7
・Phenom II X4 945
・RADEON HD4850

「Draw~系の呼び出しコストはかなり高いので、なるべく回数を減らす」というのがまず大前提です。MSのXNA担当者があちこちで「インスタンシングを導入しろ」と宣伝してるのもそのためだと思います。

サンプルプログラムはDraw~をmodelMax回(1000回以上)呼び出してるわけで、それ自体が相当、効率が悪いはず。もしかするとDraw*Primitives()とDrawUser*Primitives()の違いもそれに隠れてしまってるのでは?

今回の改修は、インスタンシングまでやり切ってしまわないと効果が見えないように思います。

PC早い?Xbox360遅い?

HOSSIEさんこんばんは。
Xbox360で試して頂いたとのことで、ご報告ありがとうございます。

インスタンシング適用前のXbox360は、私のPC環境(マザーボード内臓グラボ)より遅いようですね。細かいモデルを沢山動かすのは苦手なのかも。

>自前BasicEffectインスタンシング版適用
適用した方式は何ですか?vFetchを使用したHWインスタンシングでしょうか?

PCの速度を考えると、インスタンシング適用後はもう少し早くなっても良さそうですが、これが普通なんですかね?

>公式のインスタンシングサンプル
存在は知ってましたが、かなり難しそうなので避けてましたw
今ちらっと覗いたら、コンテントパイプラインでカスタムモデルを読み込む所からやってるみたいですね。やはり難しそうですが、今の作業が一段落したら、本格的に取り組みたいと思います。

>ウチのPC
適用前でXbox360適用後より早いとはツワモノですねw

なるほど

yohさんこんばんは。

>Draw~をmodelMax回(1000回以上)呼び出し
確かに効率悪いですね。と言うか、私のPC環境で1000回呼び出し出来たので最初ちょっとびっくりしましたw

>それに隠れてしまってるのでは?
効率が悪い方が、差が出やすいかと思ったのですが…。
しかし言われてみると、モデルが単純なので、頂点バッファやインデックスバッファの差は出ないかもしれませんね。

>今回の改修は、インスタンシングまでやり切ってしまわないと効果が見えないように思います。
そうですね。インスタンシングをやり切るまで頑張ります。

>適用した方式は何ですか?vFetchを使用したHWインスタンシングでしょうか?

vFetchって使ってますね、インスタンシング関連は呼び出しまで含めて公式サンプルのそのままです。
やってることはなんとなく分かりますが
積極的に弄れるほどの知識もないので中身は理解してませんw

>PCの速度を考えると、インスタンシング適用後はもう少し早くなっても良さそうですが、これが普通なんですかね?

効果は出ましたが思ったほど高速になってなかったので何かミスってたかもしれません…
最初試したときはインスタンシングモデルのDrawを1000回呼んでしまいひどいことになった程度には適当なのですいませんw

処理的にやってることは公式サンプルと大差無いと思うので性能目安としてサンプルを評価してみると良いかも
…というか先日テストしたプロジェクト消しちゃったのでうんたん

ご存知かも知れませんが、Draw~が遅い理由はここが詳しいです。

http://blogs.msdn.com/ito/archive/2009/03/25/how-gpus-works-01.aspx

ご参考までに。


ちなみにFPSの測定はどうされてるんでしたっけ? 私もHOSSIEさんの仰ってるGameDebugを使っています。GPUのプロファイルこそできませんが、CPUのプロファイルを行うのと、全体的なFPSを測るには十分ですよ。

おはようございます~

to HOSSIEさん:

HOSSIEさんが適用したのは、公式サンプルで「VFetch instancing」と呼ばれている方式のようですね。
Xbox360の機能を効果的に活用する手法と思いますが、それでこの程度でしたか…少し残念な気もしますが、そういうものかもしれません。

http://blogs.msdn.com/ito/archive/2008/12/12/gamefest-japan-2008-demo.aspx

上記のデモによると、Xbox360の機能性能を突き詰めればもっと早く出来るはずですが、我々アマチュアが限界性能を追及するのは難しいでしょうから、案外この程度が現実的な目安かもしれませんね。

>インスタンシングモデルのDrawを1000回呼んでしまい
うわ~凄そう!w

>サンプル評価
近いうちに、公式サンプルか、上記デモのどちらかをベースに評価してみます。ちなみに、上記デモには公式サンプルの日本語改良版が含まれているようなのでご参考まで。


to yohさん:

>Draw~が遅い理由
この記事は読んだことがありますが、大変参考になりますね!

>FPSの測定
私はFRAPSという海外製のフリーツールを使用しています。
いちいち組み込む手間がいらないのと、XNA以外の一般ゲームでも広く使用されているという安心感があります(市販ゲームと自作ゲームを同じ条件で比較できます)。
但し、FPS以外のデータは取得できないのが弱点です。

コメントの投稿


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

トラックバック


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



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