飴屋

Flash3D/計算負荷を減らす

カリング

レンダリングフローで触れたとおり、Papervision3DではEvent.EnterFrameの発生の度にポリゴンの点をDisplayObjectに変換して画面に追加し続けます。この一連の処理は、ポリゴンの数が増えれば増えるほどイベント発生毎に行う処理が増えますので、ある程度のポリゴン数を超えるとPCの処理能力に応じてFPSが下がり始めます。

できる限りFPSを下げないように、Papervision3Dには処理を行うポリゴン数を減らすカリングという処理が定義されていました。org.papervision3d.core.cullingの中を覗いてみましょう。以下の4つのカリング処理のinterfaceが用意されていました。

ILineCuller
線(Line3D)のカリング
IObjectCuller
3Dオブジェクト(DisplayObject3D)のカリング
IParticleCuller
パーティクル(Particle)のカリング
ITriangleCuller
三角形(Triangle3D)のカリング

実際の実装は以下のクラスによります。

CompositeTriangleCuller
いくつかの三角形カリング処理をまとめて実行するもののようだけど未実装。
DefaultLineCuller
一点でもカメラの背後に端点がある線は無視って書いてあるけど見実装。線の端点のvisibleプロパティだけ確認して無視している
DefaultParticleCuller
パーティクルのマテリアルのinvisibleとパーティクルの点のvisibleプロパティを確認してカリング
DefaultTriangleCuller
三角形に対してマテリアルがinvisibleかどうか、三点ともにvisibleかどうか、ポリゴンがカメラに背中を向けているかどうかを確認してカリング
FrustumCuller
3D空間上の視界を示す四角錐と3Dオブジェクトを内包する立方体または球体(バウンディング)の位置関係を内側か外側か、あるいは交差するかを確認してカリング
NullTriangleCuller
書きかけの模様
RectangleLineCuller
カリング用の矩形と線を囲む矩形(バウンディング)の交差を確認してカリング
RectangleParticleCuller
カリング用の矩形とパーティクルの点の交差を確認してカリング
RectangleTriangleCuller
カリング用の矩形と三角形の交差を確認してカリング
ViewportObjectFilter
DisplayObject3Dのモード(INCLUDE|EXCLUDE)に応じてカリング

クリッピング

カリング処理のほかにクリッピング処理というのも用意されているようです。org.paperview3d.core.clippingパッケージに入っています。クリッピングは、カメラの画角(長方形)が遠景になるに従って広がっていくという視野を示す四角錐に描画対象が入っているどうかを確認して、描画の有無を判断するという処理です。視野は無限に遠く、あるいは無限に近くまである必要はなく、ある程度の距離の範囲から外側にある物体も描画対象から外します。視界の外にあるもの、目の前にあるものやめちゃめちゃ遠いものの描画を省くわけです。

上に挙げたカリング処理と内容が重なってますね。選択的に使う機能なんでしょうか。

Flash3D