
10月25日と10月26日にオンラインで開催されたUnity主催の大規模カンファレンスSYNC 2022。『プリコネ!グランドマスターズ』(以下、プリグラ)のグラフィックなどについて解説する、「『プリコネ!グランドマスターズ』のグラフィックと負荷低減 URP導入とURP環境下での最適化について」のセッションレポをお届けします。
「SYNC 2022」他の講演レポートを読む本作はサイゲームスが2022年4月1日より1週間の期間限定で公開したストラテジーゲームです。『プリンセスコネクト!Re:Dive』に登場するキャラクター達を3D化し、オートバトラー風のゲームシステムを組み込んだタイトルで、短い公開期間ながらも多くのユーザーから注目を集めていました。このセッションにはサイゲームスのシニアゲームエンジニアである大道賢人氏が登壇しました。

手探りだったUnityのBRPからURPへの移行
『プリグラ』は、これまでビルトインレンダーパイプライン(BRP)で開発を行っていたことから、Unityのユニバーサルレンダーパイプライン (URP)を導入に対して、どういった対応をすればわからなかったそう。URPへ移行するにあたって、これまで作り上げてきた既存資産の流用/移植などを決めました。


『プリグラ』におけるBRPからURP移行/導入項目は5つに分けられます。それぞれSRPBatcher対応(HLSL/ShaderGraph)とCameraStack対応、PostProcessとDropShadow表現の代替え処理の実装、RenderFeature実装、そしてRendererDataの構築です。
SRPBatcherは描画によるCPU負荷軽減を目的とし、『プリグラ』においてキャラクター(ユニット/リーダー)と背景(ボード/ギルドハウス)用のシェーダーはHLSL移植/新規実装、そしてエフェクト用シェーダーを全てShaderGraphで作成しています。


ShaderGraphの実装は、エンジニアとデザイナーの仕事を分け、エンジニアの負担を下げるためにデザイナーがシェーダー開発に取り組めるためのもの。これによって、結果的にリリース直前の締め切りギリギリまでのクオリティアップや最適化に取り組める余裕が生まれました。また、デザイナー主導でエフェクトのシェーダー構築を進められることで、パフォーマンス測定の結果からShaderGraphの最適化を行うやり方も生まれています。


CameraStackは1シーン内のベースカメラにおいて描画順を制御する仕組み。これによって、システムレイヤー表示が最優先となったことでシステム表示がされない進行不可を防ぐ事ができたようです。

URP導入によりPostProcessingStackが仕様出来なくなったことから、Volumeコンポーネントをそのまま使用。PostProcessingStackと同じように、様々な表現が使用可能であるものの、負荷の高さから処理が重めなバトルで無くADVシーンなど限定的に使用しています。

DrockShadowも同様にBRPでのProjectorが使用出来なくなったことから、リーダーや大型モンスター、そしてADVなど特定のキャラや状況で使うURP用のProjectorと、負荷が1/10と軽くユニットや小型モンスターで用いる独自の落影表現QuadShadowを実装しています。


『プリグラ』では、OutlineとProjectro、Blur、MaskBloom、Silhouutte、OverDrawの6種類のRendererDataが用途によって使われました。ブルームの有無は通常輝度で調整するものの、特定のエフェクトに限定してブルームを出す要望があったことからMask/BloomRenderFeatureを実装。サンプリング解像度が1/4に下がるように、レンダーパスクラスのコンフィグを実装することで負荷も低減させています。



『プリグラ』は如何にして処理の最適化を進めたのか
『プリグラ』の最適化は、メモリ負荷とCPU負荷の2種類があります。メモリ負荷についてはピーク時キャラデータの総メモリは1GB以下(2GB端末でも動作させるため)、CPU負荷は推奨端末でバトル中平均30fps以上という目標を持っていました。


メモリ負荷に対して何も対策していない状態では最大184体にも増え、概算でメモリも5GB近くにもなります。そのため、キャラクターのリソースのみで1GB内に収めるためにはキャラクター数を約41体に抑える必要があったのです。
メモリ負荷の最適化では、表示するプレイヤーのボード数の最大数は常に一つであることから、キャラクターのビューモデルを完全に分離。プレイヤーのボード上に配置されているキャラのみビューを更新し、それ以外はモデルのみを更新することで、プレイヤー以外が保持するキャラを生成しないように対応しています。

準備フェーズでは、フィールド9体、デッキ8体、リーダー1体、ショップ5体の合計23体のキャラを生成。バトルフェーズでは、ボード上の最大生成キャラクター数の23体の倍である46体から、表示する必要のない相手ショップキャラ5体を引いて41体に抑えています。
オートバトラーというジャンルの性質上、売却したユニットが再登場する場合もあるために、描画を破棄したキャラがいつ必要になるのか予測が出来ません。必要になる度にデータを読み込むのは、ゲームのテンポを乱し、ゲームプレイに悪影響を与えてしまいます。そのため端末スペックに合わせてキャッシュプールサイズを可変させ、ある程度余裕を持たせてメモリ負荷やデータ管理を対策し、プレイ時ストレスの軽減に気を配っています。

SRPBatcherによる最適化
当初『プリグラ』ではURP用トゥーンシェーダーを活用していましたが、多彩な表現が出来るものの高い負荷のため、低負荷のものが必要になったそう。そのため、疑似ライティングや木や雲の前後関係を正しく描画する目的で専用シェーダーを用意しました。また、SPRBatcher対応も行ったために、ゲーム内であらゆる背景を描写するも3パスコールで済んだことで、UPR用トゥーンシェーダーより1/10ほど負荷を軽減する事が出来たそうです。



SRPBatcherの最適化効果については、全キャラの各パーツがバッチ描画されていることから、ONとOFF時の比較においてONにすると、ユニット37体生成時に処理速度が3.87倍に増加したことによりフレームレートも15%向上しています。また『プリグラ』はUnity2019版でも導入できるURPのバージョン7.5.3を採用しているもの、当然のことながら最新版の方が負担も軽くなっています(開発環境はUnity 2019.4.15f1、URP7.5.3。最新環境のUnity2021.3、URP12.1.6でも動作確認済み)。


これらの最適化の結果から、平均的なフレームレートは10ほど上昇し、メモリも約800MBへ節約。そしてバッテリー消費速度は約33%改善するとともにバッテリーの発熱も5度落ちています。

最後はまとめです。ここでは、BRPからURPへの移行が可能なことや、ShaderGraphによるエンジニアとデザイナーの分業化などが出来たことをまとめています。他にも、URPの移行でも効果があるが、しっかりと最適化しなければならないことを強調し、このセッションを終了しました。

以上がセッションの内容です。筆者も公開当時にプレイしていましたが、3D化されたお馴染みのキャラクター達が可愛いかったものの、終盤戦において敵味方多くのユニットが描写されるために、描画の重さをどうやって管理しているのかが気になっていました。
開発においてBSPからURPへと移行し、パフォーマンスが向上したと解説されましたが、それでも実プレイの終盤にかけてのフレームレートが落ちることや、バッテリー消費も体感で早かったために(1試合全体の時間も約30分と長かった)、ゲームとして非常に面白かったのですが、パフォーマンス的な問題は未だ残ったままだったようにも思えます。
カンファレンスのセッションという形で本作を再び見ることができましたが、こういった形でも見てみると「また遊んでみたい」という気持ちは隠せずにいられません。より遊びやすいシステムとパフォーマンスで復活して欲しいと思ってしまうセッションでした。
「SYNC 2022」他の講演レポートを読む