輪郭線書いたところで描画がかなり遅くなったので考え直し。
いままではシーングラフ作ったらそのノードを辿っていって、ノードでそのつど描画していた。
そうするとモデル一個に2パスのエフェクト付けると、
パス1→モデル描画→パス2→モデル描画→次のモデルのパス1→...
てな感じになるけど、これは遅いし、パス1でシャドウマップ作ってパス2でそれを使った描画とかすると破綻する。するなよとかいわれるとなんだが。
なので描画をパケット化してシリアライズ、パス毎にまとめられるだけまとめることに。
パス1→モデル1描画→モデル2描画→...→パス2→モデル1描画→モデル2描画→...
という感じになんとかした。
ちゃんとシェーダに設定する変数とかもまとめれば速くなるのかもしれないけど、そこまでは大変なのでやってない。遅いけど。
それより重要なのはレンダリングパスが比較的すっきりしていじりやすくなったこと。
シーングラフのまま描画しようとすると、いろんなステートにたいしてpush/popの嵐になるから大変だわ。
結局GPUのパイプラインにあわせるのが楽と。
エフェクト辺りもちょっと整理したので管理が楽になった気がした。
あとはレンダー先とかの管理がちゃんとできるようになればエフェクト書きまくりかしら。
しかし動作条件としてFragmentProgramが無くても動くことを目標にしてるのでかなりめんどい。固定機能なんて死んじゃえ。
VertexProgram+固定機能で動く貧弱設定とFragmentProgram必須な普通設定が作りたいんだよね。豪華設定といえる程のものは作れそうに無いぜ。
もしかしてruby 1.8って遅いのでは…と最近思った。
ゲームのプロファイルをruby-profで取ったんだが、なんかちゃんと取れてなさそうな気がするのは置いとくとして、Cgのuniform変数設定が遅いと出る。
30秒動かしたうちの10秒がそこ。呼ばれてる回数が半端じゃなく多いというのもあるんだが、それだけはやくすれば速くなるってこった。
で、無駄な処理を省いてRubyで書いてた部分をC++側に移して、25秒中2.5秒にまでなったよ!
めでたしめでたし、といいたいところだが、RubyではC++の関数を呼び出すだけのそのメソッド、C++側では1.25秒しか使っていない。
つまり関数呼ぶだけで1.25秒…。こういうの見るとruby遅いといわれてるのは実感できるような…。
ちなみにプロファイル取りながら25秒間で13万コール。これで1.25秒だから、そのへん考えずにruby 1.8遅いとか言わないように。普通に使う分には十分速いよ。
1.9はまだ対応してないので試していない。
他の描画以外の部分での速度は不満が無いから描画はC++率上げていくしかないのかなぁ。
なんでゲームってこれだけハードウェア性能上がったのにいまだにシビアなんだろうね。もちろんそれだけやろうとしてることも上がってるからなんだけど。
でもrubyなんかでゲーム作ろうとしてるくらいには楽になってるか。