08/02/24 05:17:03 XxNI12Tm
では、どうすれば良いのか?ということになりますが、例としてはパーティクルシステムがあります。
それぞれのパーティクルは四角形なので全ての処理をCPU側ですると4頂点分の計算処理に加えて、
4頂点分のデータを書かないといけません。
ここで殆どの人が見落とすのがデータの書き込み自体に掛かるコストです。Xbox 360はPCに比べると速いメモリを積んでいますが、
キャッシュミスしたときのペナルティが数百サイクルと非常に大きいんです。
そして、このキャッシュミスは書き出すデータの量に比例して増大します。
ですから、通常はPosition(Vec3)、 UV(Vec2)、Color(Color) = 24バイト*4 = 56バイトとなるところを
CenterPosition、Color、そしてパーティクルの四隅を計算するのに必要なパラメーター(スケール、回転など)とすると、24バイトと
半分以下にすることでメモリ書き込みのコストを減らすことができ、さらに4頂点分の計算は頂点シェーダー内で行われるので
その分、CPUの計算量を減らすことができます。
Xbox 360のシェーダーにはvfetchと呼ばれる命令があり、これを使うとDX10のジオメトリシェーダーっぽいことができます。
クリエーターズクラブにあるパーティクルサンプルはvfetchを使っていませんが回転などの処理はシェーダー内で行っています。
URLリンク(creators.xna.com)
vfetchについてはMeshインスタンスのサンプルで使われています。
URLリンク(creators.xna.com)
現状、XNAをXbox360上で動かした場合、CPUに比べてGPUは暇を持て余しているのでこき使ってあげましょう。