2009/07/02

SIO2 - Frustum culling system があった

前のエントリで

大量のオブジェクトからカメラ付近のものだけ抜き出して描画するような仕組みはないっぽい


と書きましたが、SIO2 には Frustum culling という仕組みがあり、完全に視錐台の外にあるオブジェクトはそもそも描画しないようになっているようです。



仕組み


  1. 各オブジェクトについて、オブジェクトの bounding sphere が一部でも視推台に含まれるかを計算(sio2ResourceCull 関数)

  2. 各オブジェクトについて、上記の値が真なら描画する(sio2ResourceRender 関数)





性能見積もり(ざっくり)

視推台の包含判定がオブジェクトの個数だけ実行されるというのがちょっと気になったので試算してみます。

bounding sphere の包含判定を行う sio2CameraSphereDistInFrustum 関数を見ると、必要な演算量は、視推台の 6 面それぞれについて 3 次元ベクトルの内積と加算なので float 36 演算。

一方、iPhone 3G の CPU はだいたい 500Mflops, 描画は 50fps とすると、1 フレームあたり 10Mflops。これで全部包含判定すると、10M / 36 = 300K として、30 万回分。

プロセッサ資源を全部包含判定に使うわけにはいかないので、保守的に 5% 使うことにすると、1.5 万回分。というわけで、オブジェクト数が 1000 とか 10000 程度であれば、BVH 的なツリー構造を使わなくても O(N) 判定で特に問題ないかな、といったところです。

この辺は、大量のオブジェクトやポリゴンを扱うオフラインレンダラと比べると、そんなにオーダーを気にしなくて良い分野なのかな、という印象を持ちました。



ちなみに

テクスチャに Alpha 成分を持つオブジェクトのソートもやってくれるようですが、そこではバブルソートが使われていました。半透明オブジェクトはそんなに多くねぇよな、という理由でしょうか。



参考