
2024年3月7日、サイバーエージェントによるエンジニア・クリエイター向け技術カンファレンス「CyberAgent Game Conference 2024」がオンラインで開催されました。そこで講演されたセッションのひとつ「『プロジェクトセカイ カラフルステージ! feat. 初音ミク』3周年大型アップデートでのパフォーマンス最適化事例」のレポートをお届けします。
3周年でサービスイン以来最大規模のアップデートを実施
本セッションは、株式会社Colorful Palette クライアントエンジニアの山口智也氏と大河原壱成氏が登壇。『プロジェクトセカイ カラフルステージ! feat. 初音ミク(以下、プロセカ)』では、3周年を迎えるタイミングで3Dグラフィックを大幅に刷新。ほぼすべての3Dモデルを作り直したほか、演出表現も強化されてゲーム中のMVもすべてがアップデートされました。


大規模な改修には、ユーザーが引き続き快適に遊べるようにするための最適化も必要不可欠です。まずは大河原氏から、「3D最適化」、「アウトゲームの最適化」という2つの軸と、「定常負荷の削減」、「スパイク(処理時間が長く、一瞬プレイが止まってしまったりする現象)の軽減」、「メモリ使用量の削減」という3つのカテゴリでインゲームでの具体的事例が紹介されました。


3D最適化の具体的な事例
アセットのロード処理の見直し
リズムゲームの背景で流れるMVで使用するアセットが増加したため、リズムゲーム中に処理落ちが発生しないよう、アセットのロード/アンロード処理を見直し。MV再生に必要なアセットはすべて事前にロードし、リズムゲームプレイ中はGC処理を一時的に停止させることで対処しました。

演出機能の改修
特定領域へのカラー合成機能を複数回重ねがけできる処理を新たに実装し、画面の明るい箇所と暗い箇所を明確に表現できるようになりました。それまで1回のみだった描画を複数回行うと処理負荷が増大してしまうため、フルスクリーンでの描画をやめ、効果がほしいところにだけフラグメント処理が発生するよう最適化を行いました。

レンズフレアの最適化
MVではキャラクターなどのオブジェクトに遮蔽された際にスポットライトなどのフレアが動的に変化しますが、開発当初は各フレアごとに個別の処理を行う設計になっていたほか、こうした処理を行うにはフレアを遮蔽するキャラクターにもCollider(オブジェクトに当たり判定を設定して貫通を防ぐ機能)を設定する必要があり、CPUに負荷がかかりやすい状態になっていました。
MVをすべて刷新するにあたり、遮蔽判定をRaycastとColliderで行う設計から深度バッファを使用する設計に変更。これにより、CPU負荷が大きく軽減されました。

被写界深度処理の改修
DoF(被写界深度)演出強化のためにUnity標準の機能「Bokeh DoF」を検討したものの、負荷が重く、ミドルスペックの端末でもMVのフレームレートが低下。その代わりにカスタムしたGaussianベースのDoF処理を採用したところ、DoF演出の強化と秒間60フレーム維持を両立させることができました。

カメラの負荷を削減
カメラが1個あるごとに描画前のCPU処理、GPU描画処理が発生してしまうため「MVでサブカメラを使用しないカットではカメラ処理を走らせない」、「カメラに追従するオブジェクトの描写を専用の別カメラで行わず、メインカメラが直接描画命令を呼び出す」ように変更。こうした対処により、MVによっては最大2カメラ減らせるようになったので処理が軽くなりました。

半透明シェーダのOverdrawを軽減
ライブステージのスポットライトのような半透明オブジェクトは、常に表示しなければならいものではありません。しかし、不必要な時に描画されないようアルファのプロパティの数値を0にしても処理そのものは走ってしまい、同じピクセルに何度も書き込みを行うOverdrawが発生します。
そこで半透明用のシェーダに機能追加を行い、アルファが0の場合はスケールも0にして画面に表示されない描画をカットするように変更。不必要なOverdrawが軽減されました。

ShaderVariantの見直し
ShaderVariantは、シェーダ内で定義したキーワードの有効・無効に応じて分岐させる処理を1つのファイル内に記述しておく仕組みで、キーワードを追加するたびに指数関数的に消費メモリが増大してしまいます。3周年アップデートにともない、最適化を行う前にあらためて見直すと消費メモリが210MBにもおよんでいました。
計算負荷の低い処理はキーワードを定義せず常時処理させるなどの見直しを行ってShaderVariantを削減した結果、消費メモリを471KBまで削減できたといいます。


そのほか、大河原氏からはインゲームでシェーダのコンパイルが発生してしまうのを回避する取り組みや、MV再生時の消費メモリを抑制するため用途に応じてテクスチャの圧縮倍率を見直した取り組みが紹介されました。


アウトゲーム最適化の具体的な事例
続いて、アウトゲームの最適化に関する事例が山口氏から紹介されました。アウトゲーム最適化は「プレイ時にユーザーが感じるストレスを削る」ことと「端末が長時間のプレイでも耐えられるようにする」ことを念頭に行われました。