コンパイルの高速化とパフォーマンスのアップ方法
一部の説明にhttp://tendon.s35.xrea.com/phpBB/kb.php?mode=article&k=103
からの転載も使われています。
ここではコンパイル(VVIS)の高速化とパフォーマンス(FPS)のアップの方法について説明します。
マップ作成をしていてマップの規模が大きくなってくるとだんだんコンパイルに時間が掛かってきます。これを短縮化する方法と、同時にFPSが悪くなってくるのを防止することはマップ作成に必要不可欠です。最初からこの点を気にかけて作成しないと、後から修正することは大幅なマップの作り変えが必要になってくることがあるので作成者は見ておくといいでしょう。
コンパイルの高速化
コンパイルするときに時間がかかるのはVVISというマップのブロック化をするときの計算です。複雑なマップになるとコンパイル時間が24時間以上かかることもあり、高速化は非常に効率化のためには大事なポイントになってきます。
ここではこのVVISを早くする方法を説明します。
noclipでエリア外からみるマップ全景
Hammer上でのマップ真上からの図
この画像はVVISをFastでコンパイルしたマップ
この画像はVVISをNormalでコンパイルしたマップ
二つ比べるとAの看板がある建物がNormalでコンパイルしたマップでは消えています。
消えているということは、その分表示されるポリゴンが少なくなり、FPSがよくなります。実際に出ている数値ではFASTではFPSが105 Normalでは196と倍近くになっているのがわかります。またコンパイル時間はFastでは5分ほどですが、Normalは1時間45分掛かっています。(今回のマップの規模はDUSTBOWLの約半分くらいまで出来ているもので検証しています)
1R CP Aエリア と 1R B CPエリア と2R A CPエリアはすべてSKYBOXのツールマテリアルで作ったワールドブラシで区切られています。
この区切りの先がNormalだと一部しか表示されていないので、FPSがよくなっているので。Fastだと区切りの先も見えないところもすべて表示されているのでFPSが悪い結果になっています。
この画像はNormalコンパイルしたマップですが、区切りの向こう側は一部しか描かれていません。自分で試してみるとよくわかりますが、少し上空を移動しながら見ると、自分の見えるところから先のエリアのみ描かれているのがよくわかります。
VVISはこの区切りを計算する作業をしています。そしてこの区切りのことをリーフと呼んでいます。このリーフの法則は
区切られる法則
- ワールドブラシで区切られる。(一部のツールテキスチャーでは分割しない)
- Hammerの画面の赤、青の線で区切られる。
- hint,invisible, nodrawテクスチャでリーフ区切りする
区切られない法則
- エンティティ(func_detail等)はリーフ区切りしない
- triiger, skip, playerclipなどのツールテクスチャ-ではリーフ区切りしない
- ディスプレースメントではリーフ区切りしない
- ブラシではないエンティティ(prop_staticなど)ではリーフ区切りしない
という特徴があります。
ワールドブラシでの分割
ワールドブラシで区切られるので、ブラシのみで複雑な形を作るのはこの計算が膨大なものになってしまうということです。これを解決するためにfunc_detailエンティティが存在します。このfunc_detailはワールドブラシと同じようなのですが、リーフの区切りをしません。細かい柱や、飾りつけなどはこのfunc_detailを使うことをお勧めします。特に球体などをワールドブラシでつくるとその面すべてが区切られるのでVVISの時間が非常にかかってしまいますので注意してください。
簡単なVVISのイメージ。見えない部分をうまく作ることにより、パフォーマンスの良いマップが作れます。
この画像は一旦コンパイルした後に、HammerのメニューのMAP→Load Potal Filesを実行した時の画像ですが青い線がその区切りです。
今回わかりやすいように斜めの屋根のみdetailからワールドブラシにしてあります。
斜めの線が伸びているのがわかります。この区切りの中から見えるところだけを表示するようになるので区切りが多ければVVISの時間が掛かってしまいます。また逆に少ないと表示されるポリゴンが多くなりFPSが下がってしまいます。このバランスをとることがパフォーマンスアップにつながります。
注意としてdetailはエンティティですので、このdetailブラシでエリア外の区切りが出来ないということです。リークの発生があるので注意してください。
リークの発生があるけどその穴がどうしてもわからない場合などはMAP→entity reportでfunc_detailをまとめて削除すると、ぽっかり穴が見つかることもあります。
私はマップを作るとき飾りの建物のほとんどをdetailで作ります。しかし外の区切りになるところはワールドブラシにしています。そしてある程度の大きさで区切り部屋を作成してその部屋を外の空間のように飾りつけするようにしています。
始めころは大きな部屋をひとつ作り、その中ですべて終わらせようとするマップ作成をしていましたが、これをすると作りやすいのですが、すべてを表示する可能性が高くなり、FPSが大幅に落ちる原因にもなっていました。小さめのマップならいいですが、大きくなってくるとこれではゲームになりません。小さめの部屋をたくさんつなげるマップを目指すといいでしょう。
Hammerの画面の赤、青の線で区切られる。
マップは1024ユニットごとにリーフ分割されています。
ワールドモデル、ヒントブラシの他に、もうひとつリーフ分割が行われる場所は、1024ユニットごと、Hammerエディタ上で言えば、青色と赤色の線で表されるグリッド部分では、必ずリーフが分割されます。
このラインが部屋の真ん中や通路の真ん中を通っていると、意図せぬリーフ分割が発生してしまい、コンパイル時間を増加させます。逆に上手く使えば、hintブラシを配置することなく、意図した部分でリーフを分割することができます。
hint,invisible, nodraw面で区切られる
FPSの上げ方。
ゲームをする上でFPSの数値を気にすることは大事です。マルチプレイゲームでは上限設定をなしで60FPS以上を確保しないとゲームにラグが感じられるでしょう。私個人では100以上出るようにマッピングしています。
このFPSを上げるために大事なポイントを説明します。
コンパイル時VVISをノーマルモードでコンパイルする。
これは上記のコンパイル時の説明とだぶることがあります。リーフの分割が適度にされているともっともパフォーマンスが上がります。
ひとつの部屋の大きさを適度にする。
余分なpropはフェードアウトさせる。
prop_staticのプロパティにフェードアウトの設定があります。
これはこの設定のStartFadeoutの距離離れるとフェードアウトが始まり、End fadeoutの距離になると完全に消えます。これを使い遠くのpropを消すことによりFPSのアップに繋がります。
またオクルーダーといわれるエンティティもpropを消す効果がありますので併用すると効果的です。
以下はC-SECからの転載です。
オクル-ダ-(occluder)
(訳注:前の物体に遮蔽されて後ろの物が見えなくなることをocclusionといいます。occlusionを起こすもの、ということでoccluderという名前のようです。)
オクル-ダ-はその背後にあるジオメトリの可視性をコントロ-ルするブラシエンティティという面でエリアポ-タルと似ています。主な違いは以下です。
a)オクル-ダ-はモデルジオメトリだけを隠し、ブラシジオメトリは隠さない
b) オクル-ダ-はエリアを封鎖する必要はなく、独立して存在できる
エリアポ-タルと同様、オクル-ダ-はエンジン実行時に動的に起動されます。
ブラシエンティティであるfunc_occluderを作成することでオクル-ダ-を得られます。可視性をブロックしたいオクル-ダ-の面には tools\toolsoccluderマテリアルを、それ以外の面にはtools\toolsnodrawマテリアルを適用する必要があります。必要ない面にtoolsoccluderマテリアルを適用するとオクル-ダ-のパフォ-マンスが低下します。
注意してください。オクル-ダ-の過剰な使用はパフォ-マンスを低下させます。それぞれのオクル-ダ-が実際にマップのジオメトリを十分に隠しているかどうか確かめる必要があります。もしオクル-ダ-が数個以上のコストが高いモデルの可視性をブロックしているのなら、パフォ-マンスの向上に効果があるはずです。そうでないのなら、オクル-ダ-自体の方が隠しているジオメトリに比べてコストがかかっているのかもしれません。オクル-ダ-がパフォ-マンスを向上させているかそうでないか確かめるために、オクル-ジョンシステムをオン・オフにするr_occlusionをキ-にbindtoggleすることができます。(例:開発者コンソ-ルで"bindtoggle o r_occlusion"とすることでoキ-でオン・オフできるようになります)それから、オクル-ジョンシステムをオン・オフしながらフレ-ムレ-トを確かめ(コンソ-ルで"cl_showfps 2"を入力)てみてください。
エンティティドキュメントのfunc_occluderに詳細があります。
func_occluderの作成例についてはmaps\sdk_occluder.vmfを参照してください。
建物の中はarea_potalで外と区切る
エリアポ-タルは分断されたリ-フを「封鎖」し、可視性をコントロ-ルするのに使うブラシエンティティです。エリアポ-タルは完全に開いているか、閉まっているかしかないドアのようなものです。エリアポ-タルが閉じているときは、その後ろのジオメトリの可視性は全てブロックされています。これが開いていると、ジオメトリが見えるようになります。エリアポ-タルはエンジンの実行時に動的に開いたり閉じたりします。エリアポ-タルはまた常に開いた状態にしておくことができます。常に開いているエリアポ-タルを先が開けた通路の端に置くだけでかなりパフォ-マンスが向上します。エンジンは外のジオメトリをエリアポ-タルの形にクリップします。
エリアポ-タルのあまり直感的ではない特徴は、これが面ではなくて空間であるということです。使用するときは、通常とても薄いブラシ(1ユニットの厚さ)を作り、このエリアポ-タルブラシの全ての面がtools\toolsareaportalを使っていることを確認してください。またこのエリアポ-タルの薄い断面部分がディティ-ル以外の剛体ブラシ(ディスプレイスメントブラシもエリアポ-タルを閉じることが出来ません)で覆われていることも確かめてください。完全に閉じていないエリアポ-タルはマップデザインにおけるよくあるバグです。vbspはこの条件を自動的に検出します。ハンマ-はどこにエリアポ-タルの"リ-ク"があるのかをvbspが生成したポイントファイルを読み込むことで示すことができます。リ-ク元を探すのに苦労しているのなら「リ-クの説明」ドキュメントに詳しい情報があります。
エリアポ-タルのもう一つのトリッキ-な特徴は、水の境界を越えることが許されないということです。水があるときは、func_areaportalを2個作って、一つは水の外、もう一つは水の中におきます。この二つのエリアポ-タルは水面で接触する必要があります。
エンティティドキュメンテ-ションのfunc_areaportalに詳細があります。
見えないところのブラシはnoDrawにする。
ブラシの裏側も表示しています。表示するポリゴンを少なくするためにゲームプレイするところから見えない部分や重なっている部分はNoDrawにしましょう。
適切なプロップを使う
マップの最適化とチェック
以下はhttp://tendon.s35.xrea.com/phpBB/kb.php?mode=article&k=80からの転載です。
ゲームのパフォーマンスアップのために使えるコンソールコマンドの説明です。
自分のマップをビルドできたなら、エンジンでのパフォーマンスをチェックして最適化したい(必要なら)と思うかもしれません。このドキュメントはパフォーマンスを評価するためのソースエンジンの開発者向け機能の一部について説明します。
役に立つコンソールコマンド
ソースエンジンのコンソールの役に立つ特徴の一つは、ヘルプコマンドの存在です!コマンドについての短いヘルプが読みたい場合、helpの後にコマンド名を入力してください。さらに、コマンドを探す上での助けが必要な場合、新しいfind(検索)コマンドを使うことができます。例えば"find mat"と入力するとコマンドの中に"mat"が含まれる全てのコマンドのリストが出力されます。コンソールの使用については、「開発者コンソール」を見てください。
もう一つのポイントは、ゲーム中でのコンソールへのアクセス許可です。設定/キーボード/詳細を開くと、そこにはコンソールの使用を許可するチェックボックスがあります。
sv_cheats 0/1
これはハーフライフ1と同じです。「チート」コマンドの使用をオン、オフします。以下にあるコマンドのいくつかを使うにはsv_cheats 1でチートをオンにする必要があります。
+showbudget
まず最初にしたいとおもうことはどれかのキー(またはマウスのボタン)に+showbudgetをバインドすることでしょう。+showbudgetは何をするのでしょうか?これはエンジンがスクリーンに各フレームを描画するときにかかった時間の分的を表示するものです。ワールドブラシ、エンティティブラシ、プロップモデル、ディスプレイスメントサーフェス、3dスカイボックス、ロープや他のものを描くのにかかった時間を見ることができます。この情報をつかってマップを最適化できます。+showbudgetの表示結果によって、何を最適化するべきかわかるのです。ワールドブラシの負荷が高い?それならそれを単純にするかvisブロッキングを改善すべきだとわかります。スタティックプロップモデルが過負荷になっている?ならばモデルをなんとかすべきだ、などです。
mat_wireframe 0/1(要sv_cheats 1)
視界にあるすべてのブラシ、モデルオブジェクトのワイヤフレーム表示をオン・オフします。自分のブラシワークがどうエンジンによって分割されているか見るのに役に立ちます。これはまた何が視界の中に描かれているのか見るのにも役立ちます。
mat_leafvis 0/1
このコマンドはリーフの周りのワイヤフレームボックスの表示をオン・オフします。このコマンドをつかってマップの可視性の問題をデバッグする方法に関しては、「ジオメトリの可視性の制御とコンパイル時間」を見てください。
mat_bumpmap 0/1(要sv_cheats 1)
このコマンドはエンジンによるバンプマップ効果をオン・オフします。バンプマップの表示がフレームレートに与える影響が見たい場合は、このコマンドで効果をオン・オフして違いを+showbudgetで見ます。
mat_specular 0/1(要sv_cheats 1)
mat_bumpmapと似ているコマンドで、これはスペキュラー反射をオン・オフします。
ent_messages_draw 0/1
すべてのエンティティのインプット/アウトプット活動の表示をオン・オフします。エンティティがインプットかアウトプットによって起動されると、その活動がエンティティの場所に描画され、他のエンティティをターゲットにした場合には間に線が引かれます。ゲーム内のエンティティの活動の追跡とデバッグに役立ちます。
developer 1/2
全てのエンティティトリガーと活動のスクリーンへのデバッグ用表示をオンにします。ゲーム内のエンティティの活動の追跡とデバッグに役立ちます。