Upgrade to Pro — share decks privately, control downloads, hide ads and more …

『プロジェクトセカイ カラフルステージ! feat. 初音ミク』3周年大型アップデートでのパフォーマンス最適化事例【CAGC2024】

CyberAgent
March 08, 2024
340

『プロジェクトセカイ カラフルステージ! feat. 初音ミク』3周年大型アップデートでのパフォーマンス最適化事例【CAGC2024】

『プロジェクトセカイ カラフルステージ! feat. 初音ミク』は2023年9月で3周年を迎えました。
3周年当日には、キャラクターが年齢を重ね「進級」したりアプリ全体のリニューアルを行うなど、リリース後最大規模のアップデートを行いました。
本セッションでは、3年間運用したタイトルの超大型アップデートをリリースするために行ったパフォーマンスの最適化に関して、ゲーム全体のUI刷新によるリニューアルと3Dグラフィックスのアップデートに関するトピックを中心に具体的な事例を紹介します。

https://cagc.cyberagent.co.jp/2024/session/index.html?id=nyp3j6dtd8

© SEGA/© CP/© CFM
Copyright © CyberAgent, Inc.

CyberAgent

March 08, 2024
Tweet

More Decks by CyberAgent

Transcript

  1. 3 プロジェクトセカイ カラフルステージ! feat. 初音ミク ユーザー数 1000万人超 X(旧Twitter) フォロワー数 200万人

    公式YouTube チャンネル 登録者数 156万人 • 『初音ミク』と『人間』が織りなす新しい 物語・新しい展開 • 2D・3D・Live2D−− それぞれ描かれる魅力的な キャラクターたち • VOCALOID曲を中心に有名楽曲を多数収録した リズムゲーム • 数多の著名クリエイターから提供される楽曲・ クリエイティブ 魅力的なキャラクター(シナリオ・イラスト)× リズムゲーム
  2. 8 最適化をおこなう理由 快適に遊べるように最適化が必要! • ほぼ全てのモデルをアップデート • 全てのMVをアップデート • 全ての画面のUIをアップデート •

    キャラシェーダ、ポストプロセスの 開発 3Dアップデート UIリニューアル • グラフィックス表現の向上 大量のアセット改修 アセット管理が適切におこなわれていない ⇒アプリクラッシュに繋がる 処理負荷の増加 処理負荷を軽減していない ⇒ゲームが重くUXに影響
  3. 12 アセットのロード、アンロード処理 スパイクの軽減 ロード アンロード ・インゲームで扱うアセットを  全てロードする ・GC処理は停止する ・オブジェクトの参照関係を  事前に解決する

    ・インゲームに関わる処理のみ実行 ・インゲーム中のアセットは  すべて破棄 ・GCの再開 背景 演出が増え、MVごとに使用するアセットが増加した 対処 • 必要なアセットはMV再生前に事前ロードする • インゲーム中はGC止める • リズムゲーム中にロードやGCによる解放処理でスパイクが発生する可能性がある
  4. 14 演出機能の改修(DoF) “プロジェクトセカイ ワンダショちゃんねる 3周年スペシャル” より抜粋 定常負荷の削減 背景 前景が綺麗にボケてほしい、カメラ構造に従ったパラメータで調整したい ・Unity標準のBokeh

    DoFは採用できず(ミドル端末で60fps安定⇒40fpsまで低下) 対処 カスタムした、GaussianベースのDoF処理を採用 ⇒ 60fps安定することを確認 実装の詳細は Colorful Palette Advent Calendarに記載しています。
  5. 15 レンズフレア(新機能)の最適化 背景 オブジェクトとの遮蔽判定をもつフレアを表現したい • フレアごとの遮蔽判定処理、半透明描画をおこなう必要がある レンズフレアの最適化前  メッシュ...CPUで1フレアごとにMeshを生成し、Dynamic BatchingによりMeshを結合  遮蔽判定...Raycastを使用し、1フレアごとにRayをとばして判定する

    対処 ・深度バッファを使用した遮蔽判定により  Raycastで判定するための大量の  Collider判定処理が不要に ・DrawProceduralを使用し、  Meshの生成、結合処理を削減 ・ComputeShaderを用い、  RaycastによるCPU負荷を削減 定常負荷の削減 NEO / 星乃一歌 × 花里みのり × 小豆沢こはね × 天馬司 × 宵崎奏 × 初音ミク【3DMV】 参考:「IDOLY PRIDE」における描画最適化術
  6. 20 ShaderVariantの見直し メモリ使用量の削減 背景 ランタイム処理最適化のために機能ごとのShaderVariantを 定義していたが、量が多く、多くのメモリを消費していた ShaderVariantについて ・Shader内にKeywordを定義することで、  Keyword有効無効時の処理分岐を考慮した  Shaderを1ファイル内に記述することができる

    ・Keyword有効無効を考慮した全ての組み合わせを  網羅するShaderProgramがプリコンパイルされる  ため、Keywordを追加する度に指数関数的に消費  メモリが増加する 開発中のポストプロセスシェーダ消費メモリ ShaderVariant Keywordの定義と実行例 リズムゲーム中スパイクを発生させないように 全ての組み合わせをプリコンパイルする 7個のShaderKeywordを定義すると、2^7=128パターンのShaderファイルをコンパイルする必要がある 10個のShaderKeyword定義 … 2^10=1024パターンに...
  7. 21 ShaderVariantの見直し 対処 ShaderVariantを削減する • 計算負荷の低い処理は常時処理する • 分岐条件がUniform変数の場合、通常のif文で処理する(Static Uniform Branch)

    メモリ使用量の削減 ↓Variant削減後 最適化後のポストプロセスシェーダ消費メモリ 210.3MB ⇒ 471.7KBに削減 全てのピクセル処理で同じ分 岐を通る場合、分岐コストは 抑えられる コンパイル時分岐考慮済みの Shaderを実行するため、ラン タイム中の分岐コストは0 ピクセルごとに異なる分岐を通る場合、 分岐コストは高い
  8. 23 インゲーム中のシェーダのコンパイル回避 スパイクの軽減 対処 MVロード時ShaderVariant.Warmupによるプリコンパイルをおこなう • Keywordはマテリアル単位で定義し、Global定義は使用しない • インゲーム中使用するShaderと全ての組み合わせをShaderVariantCollectionに登録 MV再生開始

    ShaderName Normal <no keywords> Normal A Normal B Normal A B Keyword定義したシェーダ 全てのシェーダ、全ての Keywordの組み合わせを 登録する 楽曲選択 ロード ShaderVariantCollection.Warmup で登録した全組み合わせに対する Shaderのプリコンパイルをおこなう
  9. 24 圧縮形式 背景 1MVにロードするアセットが増え、 消費メモリに懸念が生じた 対処 役割ごとにテクスチャの圧縮サイズ(ASTC)を設定  実機上の見た目を最優先に考慮しつつ、  用途によって圧縮倍率を設定 例:

    Shaderでの計算処理用マップ…ASTC4x4 キャラクターやエフェクトのカラーマップ…ASTC6x6 メモリ使用量の削減 https://developer.nvidia.com/astc-texture-compression-for-game-assets NVIDIAが公開している 圧縮形式、サイズごとの視覚的評価