大量にパーティクルを出したいわけだが、とりあえず普通にパーティクルシステムを作ってみた。
頑張ってキャッシュに乗るように、分岐が少ないように、無駄な処理をしないように作ってみた。
DirectX9、ポイントスプライトで40万個で16ms弱
PCスペックはCore i7,GeForce GTX 460
Root-Nodeの形の最もシンブルなツリーの場合。
移動は等速運動、回転、スケールは固定、色もアルファも固定。テクスチャも貼ってるだけ。
カリングやZ比較はしていない、アルファブレンドは加算合成。
こんなもんだろうか。もう少し高速化したいがもっと必要に迫られたらかな。
さらなる高速化として、ぱっと思いつくのは以下。
- 無駄な分岐を減らす
移動、回転、スケール、カラーとか幾つかタイプがあって粒子の数だけ毎回分岐処理しているから絶対重い。
試しにスケールの分岐をコメントアウトしたら1ms早くなった。
この辺の処理部分は全部rubyで書き出しているから比較的簡単にすべての組み合わせを書き出せると思われる。
(とは言えやっぱり面倒だ) - SIMD命令を使う
どう書いたら良いかわからないけど調べれば簡単そうだ。 - 並列処理
実装が少し面倒だ。ちゃんと設計が必要。
他のコードとの兼ね合いもある。 - GPUを使う
処理フローが全然変わってちょっと大変かも。
それにある程度機能を限定する必要もありそう。
最終的にスマフォで使いたいから頂点テクスチャは使えないので別の方法を考える必要がある、というか頂点バッファを使えば良いと思っている。 - SPH法を使う(全然どんなものか知らないから高速化とは関係ないかも。流体的な動きをさせたいならこれ?)
学習コストが高い!がいつか勉強したい。