『FINAL FANTASY VII REMAKE』におけるプロファイリング 詳細な処理負荷の回避と最適化に向けたワークフロー
レベル最適化
ここからの解説はゲームプログラマーの田原篤史氏が担当。
FNameの初期化
文字列で初期化しがちだが、毎回ハッシュ化とID検索があるため、無視できない負荷がかかる。FNameを代入すると整数値のコピーのみなので十分高速になる(Static変数の定義などで文字列の代入を極力回避する)、
TMapのシリアライズ回避
TMapの代わりにTArrayでシリアライズし、ロード時にTMapに展開する(TArray型のプロパティのみシリアライズし、TMapはランタイムで構築)。試したMapのレベルで合計約33000要素のデシリアライズ時間を比較すると、60%改善した。
DataTableの独自シリアライズ
自社内製ツールでUDataTableを自動生成するようにしていたのを、シリアライズの部分のみ独自に生成するよう変更した。するとデシリアライズの時間は約65%の改善、ファイルサイズは約70%の削減となった。
カットシーン開発環境
基本的にUE4のシーケンサーを使用しているが、レイアウトからモーションの出力まではMotionBuilderを使用し、自社開発のインポーターでシーケンサーを自動生成している。エフェクト、ライティング、サウンドはUE4でライブエディットしている。
シーケンサー分割
ゲームの進行に準じてカットシーンをロードしてしまうと、その分だけメモリを消費してしまう。そのためオーサリングの段階で前半の数ショットと後半のアセットを分割しておくようにした(カットシーンの再生前に前半が、再生後に後半がロードされる)。
するとカットシーンをロードするタイミングを厳密に気にする必要がなくなった。
しかしシーケンサーそのものを分割する手法は実装のコストが想定外に高かった。
リソースを軽く参照できるようにすれば、分割せずにリソースのロードのみで対応できた(UE4.23から導入されたAnimation Streaming機能の利用を検討したい)。
背景表示の切替によるヒッチ対策
背景の切替時に最もヒッチが発生しやすく、切り替える背景のアクター数が多いと描画負荷がかかるためフレーム単位で分散する。アクターが非表示の状態でロードして、表示の際には1フレーム当たり10ms未満で分散しながら表示していく。
カットシーンによっては1フレームで表示が切り替わってほしい場合もある。それには切り替わったタイミングでは1フレーム、そうでないタイミングではフレームを分散させるようにした。約4400のアクターの切り替えが必要なカットシーンで、273msから115msに改善した。
■真狩祐志
東京国際アニメフェア2010シンポジウム「個人発アニメーションの15年史/相互越境による新たな視点」(企画)、「激変!アニメーション環境 平成30年史+1」(著書)など。
UNREAL FEST EXTREME 2021 SUMMER
https://www.unrealengine.com/ja/events/unreal-fest-extreme-2021-summer