ようやくシェーダでスキンメッシュができるようになりました。
ようやく、ようやくですよ!長い道のりでした。
とりあえず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倍になるので、
素直にシェーダでやっとけといわざる終えません!笑