2010/2/23 Na-7
2010/2/24 Na-7
2010/3/2 Na-7
2010/3/7 Na-7

 

技術資料一覧に戻る

 

XNA モデルインスタンス テクニック 比較一覧表

 

注意 この資料は、筆者が自らの経験を記録したものであり、他人に勧めるものではありません。

この資料を参考として行った行為がいかなる結果になろうとも、筆者は責任を負いませんので予めご承知おきください。

 

◎目次

◎概要
◎使用ツール
◎XNA モデルインスタンス テクニック 比較一覧表
◎参考URL

 

 

◎概要

モデルインスタンスとは、同じモデルを多数描画する際の負荷を軽減し、パフォーマンス(≒描画速度)を向上させるためのテクニックである。

テクニックの種類は複数存在し、それぞれ長所や短所がある。パフォーマンスの飛躍的な向上が期待できる一方、使う場面を誤ると却って負荷が増大することもある。

ここでは、テクニックの種類や効果(倍率)、長所短所などを整理し、テクニックを選択する際の参考資料とする。

個々のテクニック導入に関しては、参考URLを足掛かりに各自で対応すること。

 

 

◎使用ツール

ツール名 入手元
XNA3.1(XNA GameStudio 3.1:ゲーム開発用フレームワーク) http://msdn.microsoft.com/ja-jp/xna/default.aspx

 

 

◎XNA モデルインスタンス テクニック 比較一覧表

日本語名称(注1) 公式サンプル(注2)の名称 プラットフォーム 倍率(注3) 概要 長所 短所 CPUコスト(注4) メモリコスト Maximum instances per draw call(注5) How instance positions are specified インデックスデータ複製要否 頂点データ複製要否
No instancing or state batching Any 1倍 非インスタンシング。

公式サンプルで、他のテクニックと比較するために用意されたもの。通常のループで何回もModelMesh.Drawを呼び出すことに相当する。

・開発コストが低い ・パフォーマンスが悪い × 1 Effect parameter 不要 不要
マテリアルバッチ No instancing Any 3倍 ループ内のデバイス設定処理を効率化したもの。

GPUの特殊機能等は使用していないので、公式サンプルでは「No instancing」と呼んでいる。

・シェーダープログラムを必要としない
・レンダーステートの変更数を減らすことができる
・DrawIndexPrimitive の呼び出し回数は多いまま
・実行時のコードやデータ構造が複雑になる
・汎用的なバッチ処理をするには時間が掛かる
1 Effect parameter 不要 不要
シェーダーインスタンス Shader instancing Windows, shader 2.0 50倍 頂点&インデックスデータを最大インスタンス分コピーし、GPUの定数レジスターに格納、一度の描画命令で多数のモデルを描画する技法。

描画命令の発行回数が減るのでパフォーマンスは向上する(CPUコスト低減)が、GPUリソース使用量は増加する(メモリコスト悪化)。

・マテリアルバッチより効果的
 ・DrawPrimitive の呼び出し回数が減る
・シェーダーモデル1.1から使える
・実行用のコードが簡潔に書ける
・GPU リソース使用量が増える
・定数レジスターの数に制限がある
 
× 〜60 (注6) Effect parameter array 必要 必要
HWインスタンス(Windows) Hardware instancing Windows, shader 3.0 50倍 シェーダーインスタンスでは頂点&インデックスデータをCPU側でコピーしていたが、これをGPU側で一括処理するイメージ。

シェーダーインスタンスよりもGPUリソース使用量が少ない利点がある。

・Windows と Xbox 360 の両方で使用可能
・インスタンスデータを頂点バッファーに書ける
・シェーダーモデル3.0が必要 無制限 Secondary vertex stream 不要 不要
HWインスタンス(Xbox360) VFetch instancing Xbox 360 50倍 VFetchとは、Xbox360のシェーダー内で頂点データをフェッチするためのアセンブリ命令。

インデックスデータのみ最大インスタンス分コピーする必要があるため、GPUリソース使用量はその分増加する。

・Windows と Xbox 360 の両方で使用可能
・インスタンスデータを頂点バッファーに書ける
・GPU リソース使用量が増える(インデックスデータのみ) 〜60 (注6) Effect parameter array 必要 不要
ダイレクトマッピング Xbox 360 115倍 ダイレクトマッピングは、動的頂点バッファーを効率良く扱う技法の1つである。資料(注1)では、HWインスタンスとダイレクトマッピングの組み合わせを「ダイレクトマッピング」と呼んで他の技法とパフォーマンスを比較している(資料内最速技法)。                
注1 ひにけにXNAのYuichi Ito氏がGamefest2008向けに著した プレゼンテーション資料より
注2 XNA クリエーターズ クラブ オンラインの「メッシュのインスタンス化」より
注3 注1資料より(適用先のプログラムや環境によって異なるので、目安程度に考えること)
注4 倍率に影響を与える
注5 1度の描画命令で描画可能な最大インスタンス数
注6 シェーダに依存する
(例:シェーダモデル2.0の場合、定数レジスタ下限は256。個別インスタンス情報をマトリックスで与える場合、1情報につき定数レジスタ4つ必要。さらにWorld、View、Projectionのマトリックスに4×3個使用した場合、60モデル分の個別インスタンス情報が上限値となる。)
(参考:筆者メインPC(Intel Core2 Duo CPU E6750 2.66GHz、内蔵グラボ)の上限は1023、サブPC(Pention4 1.6GHz、GeForce FX 5200)の上限は60であった。詳細はブログ参照。)

 

 

◎参考URL

番号 タイトル&URL コメント
メッシュのインスタンス化 XNA クリエーターズ クラブ オンラインの公式サンプル。添付の英語ドキュメントが良さげ。誰か訳して〜w
X5_XNA Framework のパフォーマンス ひにけにXNAのYuichi Ito氏がGamefest2008のプレゼンテーション用に著した資料。音声データ付き。
Gamefest Japan 2008 デモプログラム 上記資料と共に使用されたデモプログラム。準公式的サンプル。
XNA 複数のメッシュを一度のDrawで描画(ハードウェア・インスタンシング) 公式サンプルよりも簡潔なサンプルコードあり。
XNA 複数のメッシュを一度のDrawで描画(シェーダー・インスタンシング) 公式サンプルよりも簡潔なサンプルコードあり。
XNA3.1でUVアニメーション(シェーダインスタンス方式) シェーダインスタンスでUVアニメを行うサンプル。
XNA3.1でUVアニメーション(シェーダインスタンス&動的頂点バッファ方式) シェーダインスタンスと動的頂点バッファでUVアニメを行うサンプル。

 

inserted by FC2 system