多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】 | GameBusiness.jp

多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】

多ユニットが戦い合う『プリコネ!グランドマスターズ』は確かに1試合終盤になると重かったが、どのように最適化したのか

ゲーム開発 ゲームエンジン
多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】
  • 多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】
  • 多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】
  • 多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】
  • 多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】
  • 多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】
  • 多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】
  • 多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】
  • 多ユニットが戦う『プリコネ!グランドマスターズ』のグラフィックと処理負荷はどのように最適化されたのか―URP環境へ移行の対応例【SYNC 2022】

10月25日と10月26日にオンラインで開催されたUnity主催の大規模カンファレンスSYNC 2022。『プリコネ!グランドマスターズ』(以下、プリグラ)のグラフィックなどについて解説する、「『プリコネ!グランドマスターズ』のグラフィックと負荷低減 URP導入とURP環境下での最適化について」のセッションレポをお届けします。

「SYNC 2022」他の講演レポートを読む

本作はサイゲームスが2022年4月1日より1週間の期間限定で公開したストラテジーゲームです。『プリンセスコネクト!Re:Dive』に登場するキャラクター達を3D化し、オートバトラー風のゲームシステムを組み込んだタイトルで、短い公開期間ながらも多くのユーザーから注目を集めていました。このセッションにはサイゲームスのシニアゲームエンジニアである大道賢人氏が登壇しました。

配信当時、詳細情報が少なく突然『プリコネ』のハイクオリティな新規コンテンツである『プリグラ』が表れたことから、一部のコアな『プリコネ』ファンの間で開発規模や時期など様々な推測がされていた。大道氏のプロフィールによれば少なくともオートチェスが流行った前後の2019年には『プリグラ』の開発がスタートしていたようだ
2022年11月現在『プリグラ』は公開が終了してしまっているが、『プリコネ』公式Twitterで公式映像が見られる

手探りだったUnityのBRPからURPへの移行

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

『プリグラ』におけるBRPからURP移行/導入項目は5つに分けられます。それぞれSRPBatcher対応(HLSL/ShaderGraph)とCameraStack対応、PostProcessとDropShadow表現の代替え処理の実装、RenderFeature実装、そしてRendererDataの構築です。

SRPBatcherは描画によるCPU負荷軽減を目的とし、『プリグラ』においてキャラクター(ユニット/リーダー)と背景(ボード/ギルドハウス)用のシェーダーはHLSL移植/新規実装、そしてエフェクト用シェーダーを全てShaderGraphで作成しています。

HLSL化のためのシェーダーの処理例

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

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

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

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

ドラッグ中のユニットを動かした時に、背景にも影を落としたい場合にはProjectorを使用する

『プリグラ』では、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ほど負荷を軽減する事が出来たそうです。

先に解説されたURP用ProjectorとQuadShadowもcall数に注目すると、QuadShadow側のCall数が少ないのがわかる

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」他の講演レポートを読む
《G.Suzuki》

この記事の感想は?

  • いいね
  • 大好き
  • 驚いた
  • つまらない
  • かなしい
【注目の記事】[PR]

関連ニュース

特集

人気ニュースランキングや特集をお届け…メルマガ会員はこちら