ようやくシェーダでスキンメッシュができるようになりました。
ようやく、ようやくですよ!長い道のりでした。
とりあえずCPUスキンメッシュとどのくらい処理速度が違うのか
計測してみましたが、早いです!やっぱりGPUは偉大だなと思いました。
以下少し比較めも&ちょっとした考察です。
・CPUスキンメッシュ(1/2モーションスキップ)、キャラ5体:50fps
・CPUスキンメッシュ(1/2モーションスキップ)、キャラ10体:28-30fps
・シェーダスキンメッシュ、キャラ5体:60fps
・シェーダスキンメッシュ、キャラ10体:53-55fps
今まで5体までしか表示してませんでしたが、試しに10体表示させてみると
やはり全然違ってきますね。それとパーティクルは現状、CPUで頂点計算
させているので、シェーダ有りでも10fpsほど落ちてしまうんですが、
これもシェーダで計算させるとまだ速度が上がるかもしれないです。
ただ、長い時間PCを使い続けているとなぜかCPUスキンメッシュと
シェーダスキンメッシュが同じくらいの速度(30fps近く)に
なってしまいました。PCを使い続けるとメモリが断片化して
処理効率が悪くなるのは前から気がついていたんですが、
シェーダ有り・無しとで速度が同じになるのは少し疑問だったりします。
そういえば、いままでDraw系命令を呼び出した直後に
GPUに描画命令が転送されているものだとばかり思ってましたが、
どうやらDraw系命令やSetRenderState系命令を行うと、
一度コマンドバッファと呼ばれるGPUでの命令手順を格納した
バッファにプッシュして、Present()を行うことでまとめて
命令とデータをGPUに転送しているんだそうです。なので
それによって実際はフレーム計算をしている間GPUは並行して
1つ前のフレームの描画を行ってるんだそうな。
てことは、以前考えていた「マルチスレッドにすることでGPGPUと
同じ理屈で処理が早くなるんじゃね?」というアイデアは意味がないですね。。
ただ、Lock()はその時点でGPUにアクセスしなければならないので
GPUがそのバッファを描画に利用していた場合、CPUは待機させられるそうです。
ということは!パーティクル計算が現在重いのはCPUで頂点計算を
させる際、待機させられているから処理が重くなっている可能性が高いので、
バッファを複数用意して、奇数フレーム用バッファと偶数フレーム用
バッファといった感じでバッファを使い分けることで、シェーダを使わずに
少しは処理速度が上がるんじゃないかなと、ふとそう思いました。
ただ、これだとバッファのための確保サイズが2倍になるので、
素直にシェーダでやっとけといわざる終えません!笑
たけなか 2010.03.11-09:38 Edit
メモリが断片化するとシェーダスキンメッシュもCPUスキンメッシュと
同じくらい重くなるのは、ひょっとするとデバッグモードが関係して
いるかもしれない。リリースモードにすると早くなるかも。