プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
シェーダーインスタンス1000枚
UVアニメサンプル改
動的頂点バッファをやめて、UV座標をシェーダー定数で渡すようにした。回転軸が固定化されたので、板ポリモデルの回転方向は以前と異なる。



◎はじめに

今回は、普通のシェーダーインスタンス版を作成します。

前回方式より速くなるかどうかは、やってみないとわかりません。速くなるといいなぁ。



◎定数レジスタのフォーマット

動的頂点バッファをやめて、UV座標も定数レジスタにセットしてシェーダに渡します。私は以前アニメ番号を渡す案を書きましたが、yohさんの案の方がスマートなので、yohさんの案を採用させて頂きます。

・position(Vector3)

・scale(float)

・rot(float)
 →回転はY軸固定とする

・textureCoordinate(Vector2)
 →左上頂点のオフセットだけ渡して、頂点データ側に
  “オフセットUVに加算する量”を埋め込む



◎回転の頂点変換式

UV座標関連の改修は難無く出来たのですが、回転関連の改修は1度失敗し、こちらで一次変換式を確認して直しました。

// Y軸を中心に回転させる(HLSL)
float3 ps = input.Position * scale;
float4 pos_ws;
pos_ws.x = pos_os.x + (ps.x * cos(instanceParam1.z) - ps.z * sin(instanceParam1.z));
pos_ws.y = pos_os.y + ps.y;
pos_ws.z = pos_os.z + (ps.x * sin(instanceParam1.z) - ps.z * cos(instanceParam1.z));


さほど難しい話でもないのに、この式を導き出すだけで3時間もかかってしまいました(爆)



◎パフォーマンス測定

改修が完了したので、パフォーマンスを見てみましょう。

シェーダーインスタンス1000枚

○両面板ポリアニメ:1000枚
 一度に描画するインスタンス数:100枚
 光源計算:なし
  メインPC:60fps、60fps0.79ms
  サブPC:40fps、34fps1.26ms
 光源計算:あり
  メインPC:60fps、60fps1.06ms
  サブPC:43fps、35fps1.32ms

○両面板ポリアニメ:10000枚
 一度に描画するインスタンス数:100枚
 光源計算:なし
  メインPC:44fps、15fps7.27ms
  サブPC:9fps、3fps9.69ms
 光源計算:あり
  メインPC:43fps、15fps9.61ms
  サブPC:8~9fps、4~5fps9.54ms

前回方式と比較すると、CPU処理時間が1.5~2倍ほど短縮された反面、fpsは若干低下したようですね。できればサブPCのfpsを上げたかったのですが、CPU負荷が軽減された分、GPUに負荷が集中してしまったようですね。


ちなみに、バッファへの動的書き込みをしない場合は、動的頂点バッファと静的頂点バッファのパフォーマンスは同等でした。また、板ポリの回転速度を変えた場合も、(画面更新量は変わるが)パフォーマンスへの影響はありませんでした。



◎画面表示数を制限する

fpsを向上させる条件を探るため、画面に表示する枚数を少なくしてみました。

画面表示数100枚

○両面板ポリアニメ:1000枚
 一度に描画するインスタンス数:100枚
 光源計算:あり
  メインPC:60fps、60fps1.03ms
  サブPC:60fps、60fps1.33ms

○両面板ポリアニメ:10000枚
 一度に描画するインスタンス数:100枚
 光源計算:あり
  メインPC:60fps、60fps7.75ms
  サブPC:60fps、60fps7.69ms

インスタンス数を10000枚、画面表示数を10×10=100枚としたら、ようやくサブPCで60fpsになりました。

インスタンス数がCPU時間、画面描画数がfpsに影響するということですね。これを踏まえてゲームデザインを調整すれば、60fpsも実現可能と思います。



◎サンプルプロジェクト

プログラム整理が完了したので、HPにサンプルプロジェクトをUPしました。

XNA3.1でUVアニメーション(シェーダインスタンス方式)



◎パフォーマンス向上計画

60fpsを達成するための具体的な指標が見えてきたので、板ポリアニメのシェーダーインスタンス化は今回で終了します。

次のテーマは「簡易モデルのパフォーマンス向上」です。

1.Gamefest2008デモプログラムの
  コンテントパイプラインを解析する

2.カスタムモデルクラスを使用して
  簡易モデルを読み込むサンプルを作成する

3.2のサンプルにシェーダーインスタンスを適用し、
  パフォーマンスを確認する


簡易モデルのパフォーマンスが向上したら、本番プロジェクトに実装してパフォーマンスを調整します。


4.カスタムモデルクラス実装

5.簡易モデルシェーダーインスタンス実装

6.板ポリアニメシェーダーインスタンス実装

7.パフォーマンス測定&ゲームデザイン調整


これで理想に近いパフォーマンスが実現できると思います。目標はメインPC:60fps、サブPC:30fps以上です。



◎次回予告

長いことパフォーマンスに苦戦してきましたが、ようやくまともなパフォーマンスが実現できる目途が立ったので嬉しいです(^^)

次回は、Gamefest2008デモプログラムのコンテントパイプラインを解析します。

スポンサーサイト

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

コメント

コメントの投稿


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

トラックバック


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



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