元記事:Dev-Ref-Release Notes-2.49-Game Engine - BlenderWiki
訳注:便宜上ページを分けています。


ゲームエンジンのスピードアップ



重要な最適化


- Bullet の Convex hull(凸包)Mesh の作成が速くなり、開始時間が高速化。

- Bullet の 物理演算 Mesh の変換がスピードアップ。

- Blender Player の Profile の描画がスピードアップ。

- パフォーマンス向上のため、Expression Controller 用のキャッシュを実装。


小さな最適化


- フラットシェードの Face で Vertex を共有できるようになり、一部のモデルではパフォーマンスが向上します。

- Controller の変換時にスクリプトのコンパイルを行い、よりパフォーマンスが予測しやすくなりました。また、スクリプトが最初に実行された時ではなく、早い段階に構文エラーの出力をするように。

- 値をベクトルに指定するのに vec= MT_Vector3(x,y,z)の代わりに vec.setValue(x,y,z)を可能なところで使用。MT_Point と MT_Matrix 型も同様です。

- SG_Spatial::SetWorldFromLocalTransform()を追加。いくつかのケースで Local の Transform が World の Transform 用に使用されていることがあるためです。

- UpdateChildCoordinates関数の不要な変数をいくつか削除。

-Py API - Mouse、Ray、Radar Sensor - 各関数内のリストを埋める代わりにPyObjectFrom(vec)を使用しています。get*()関数には METH_NOARGS を使用しています。

- Py API - Python の Vector の引数を読む時、汎用の Python シーケンス型を使う代わりに、Python タプルをチェックすることで、約二倍にスピードアップしました。

- Mesh の変換時、各 Face の Material オブジェクトのアロケート/破棄を回避することでスピードアップしました。

-(Armature と ShapeKey 以外の)モディファイアのある Mesh のディスプレイリストが作成できるようになりました。これらは Mesh を静的に変形するため、ディスプレイリストの中で安全に置くことができます。モディファイアのレンダリングを直接 OpenGL を呼び出す中で行うことで、パフォーマンスを若干引き上げます。


BGE シーングラフの改良


シーングラフの改良は、最後に更新した時からそのオブジェクトが動いていない場合に位置の更新を回避し、その不必要な更新を除去することと、物理エンジンとラスタライザとの同期化からなります。


視野錐体カリング


Bullet 物理ライブラリのダイナミックバウンディングボリュームツリー(DBVT) Broadphase 機能 が、シーン内の表示オブジェクトのツリーを構築するのに使用されており、このツリーの要素はオブジェクトを包む Aabb(Aligned Axis Bounding Boxes: 軸と並行なバウンディングボックス)です。この機能は、屋内と屋外シーンでいい精度が出ます。
この新しいカリングシステムは、デフォルトで ON になっていますが、万が一のため、WorldButtons 内のボタンで OFF にすることができます。

これらの改良により、BGE のカリングとシーングラフの一部が2.48に比べ、ほぼ5倍速くなりました。ただし、このスピードアップは多くのオブジェクトがある(100以上)場合でないと気がつかないでしょう。


オクルージョンカリング


オクルージョンカリングは、いくつかのオブジェクト(Occluder: 遮蔽するもの)が他のオブジェクトを隠します(つまり、これらをGPUに送りません)。視野錐体カリング同様、その実装は、Bullet のダイナミックバウンディングボリュームツリーを元にしています。

この機能を最大限に活用するには機能の理解が必要なため、オクルージョンカリングはデフォルトでは OFF になっています。正しく使用されないと、単にゲームが遅くなってしまうでしょう。オクルージョン処理時間を自動的に調節するほど頑強なシステムではないのです。


動作


オクルージョンカリングはシーン内に Occluder が少なくとも一つあれば有効になります。Occluder オプションは、GameButtons にあります。

GameButtons左上

この "Occluder" オプションは、Mesh オブジェクトのみ動作します。物理演算が関係する範囲では、これは "No collision" に相当します。
なぜ私が他の Physics モードと排他の Occluder モードを作成することにした理由は、Occluder が特別にこの目的にデザインされたものであるという事実を強調するためと、すべての Mesh を Occluder にすべきではないということからです。ただし、Python と LogicBrick を使用することで、Physics オブジェクトでもオクルージョン機能を有効にすることができます。そのことについては後ほど。

単一の Occluder オブジェクトが視野錐体内に入った時、BGE は Z深度バッファをそのオブジェクトの Face から作成します。その Face が片面・両面のどちらであるかが重要です。こちらを向いている Face もしくは両面 Face のみが Z 深度バッファ作成に使用されます。もし複数の Occluder が視野錐体内に入った場合、BGE はそれらを組み合わせ、最も前にある Face を保持します。

Z 深度バッファの解像度は WorldButtons の "Occlu Res" でコントロールできます。

WorldButtons右

デフォルトではこの解像度はビューポートの最大寸法に対し128ピクセルになっています。一方他の寸法の解像度は比例して設定されます。128は非常に低い解像度ですが、カリング目的には充分です。この解像度は最大1024まで上げることができますが、CPU の負荷が非常に上がります。

BGE は DBVT をトラバースし、それぞれのノードに対し、Occluder に全体が隠れていないかをチェックします。もしそうなら、そのノード(とその中に含まれるオブジェクトすべて)を刈ります。

この機能を更に最適化するため、少なくとも一つの Occluder が視野錐体内がないと BGE は Z 深度バッファの作成と使用をしません。その時まで通常の視野錐体カリングと比べ、パフォーマンスの低下はありません。


使用方法


以下の状況ではオクルージョンカリングは何のメリットもありません。


オクルージョンカリングは、Occluder が大きなオブジェクト(ビル、山など)であり、気まぐれに多くの複雑なオブジェクトを隠す時に、最も有用になります。しかし、あまりパフォーマンスに関係なく、たとえ不適切に使用した場合でも、そのアルゴリズム構造の所為で、パフォーマンスの低下は限定的な物となるでしょう。

Occluder は可視の形状オブジェクトにすることができますが、非常に多くの Face があると、Z 深度バッファの作成が遅くなることに注意して下さい。例えば、オクルージョン用には地形はあまりいい候補にはなりません。Face が多すぎて、重なる部分も多すぎるからです。Occluder はもっと複雑なオブジェクトの内側にある、見えないオブジェクトがいいでしょう(例:複雑な構造のビルの「壁の中」など)。Occluder にはオブジェクトを通して見ることができる「穴」を持たせるといいでしょう。

以下は複雑な地形から Occluder を作成するワークフローです。


更に最適化するには、Occluder をいくつかのオブジェクトに分離(Occluder を山毎、壁毎などに)し、地形にも同じことをするといいでしょう。この方法で、Occluder の後ろにある地形のパーツがレンダリングされなくなります。

ワイヤフレームモードでゲームを実行し、オクルージョンがどう動作しているか検証するといいでしょう。


ゲーム内でのコントロール


Python でオブジェクトのオクルージョン機能のON/OFFができます。
obj.occlusion = True
obj.setOcclusion(True, False)    #param1=occlusion, param2=recurse in children

対象オブジェクトは GUI での Occluder 設定は必要ありません。オクルージョン機能をゲーム中、Static でも Dynamic でも好きな Mesh オブジェクトに設定できます。

また、Visibility Actuator を使用することもできます。

Visibility Actuator

Actuator のレイアウトが変更されているのに注意して下さい。Visible/Invisible は二つの独立したボタンから、トグルボタンに置き換えられています。ボタン ON で機能が有効(Visible・Occlusion)、OFF で反対の機能が有効(Invisible・Occlusion なし)になります。

Actuator は Visibility と Occlusion モードを同時に設定することに注意して下さい。もし別々に設定したい時は Python を使用して下さい。


既知の制限


もしオクルージョンカリングを使用したい場合、最低一つの Occluder がゲーム開始時になければなりません。Occluder はアクティブレイヤにある必要はありません。その後ゲーム中、ゲーム内のコントロールを使用してオクルージョン機能を Mesh オブジェクト毎にON/OFFできます。



元記事:Dev-Ref-Release Notes-2.49-Game Engine - BlenderWiki
30 May 2009, at 09:20版を元にしています。