2009/07/02
テーマ: 開発 / iOS / 2009 / すべて
前のエントリで
大量のオブジェクトからカメラ付近のものだけ抜き出して描画するような仕組みはないっぽい
と書きましたが、SIO2 には Frustum culling という仕組みがあり、完全に視錐台の外にあるオブジェクトはそもそも描画しないようになっているようです。
視推台の包含判定がオブジェクトの個数だけ実行されるというのがちょっと気になったので試算してみます。
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 成分を持つオブジェクトのソートもやってくれるようですが、そこではバブルソートが使われていました。半透明オブジェクトはそんなに多くねぇよな、という理由でしょうか。
View Frustum Culling Tutorial
原理、ソースコードなど。