この記事の3行まとめ
- サイバーエージェントの「コアテク」、Unity 6のAPI「GraphicsStateCollection(GSC)」の解説記事を公開
- モバイル環境におけるシェーダーのWarmupでGSCを活用し、スタッターを防止する手法をサンプルコード付きで紹介
- GSC導入後もスタッターが残った事例とその解決策についても解説している
サイバーエージェント ゲーム・エンターテイメント事業部 コア技術本部(以下、コアテク)は2026年7月7日(火)、『GraphicsStateCollection を使ったシェーダーウォームアップについて』と題した記事を公開しました。
モバイル環境において、Unity 6より導入されたAPI「GraphicsStateCollection(以下、GSC)」を用いてシェーダーをWarmupすることで、シェーダーコンパイルスタッター(シェーダーコンパイルによる処理落ち)を防止する知見を紹介。
GSCの基本的な使い方を説明したうえ、Unity 6.3 LTSでの開発時にアクシデントが発生した実例や、それらを解決した方法について解説しています。
(画像はブログ記事より引用)
GSCは、シェーダーバリアントとグラフィックス状態の組み合わせを保存し、まとめて「Pipeline State Object(PSO)」を生成できるAPI。Unity 6より実験的機能として搭載されたもので、「ShaderVariantCollection」の代替として位置づけられているとのこと。
GSCで記録される情報の例(画像はブログ記事より引用)
シェーダーコンパイルスタッターの要因は、シェーダーバリアントの初回描画時にShader.CreateGPUProgramでの変換とPSO生成という2段階にわたるコンパイル処理を行うことで処理負荷が発生するためだと説明。
MetalやVulkanではPSO生成のコストが大きいため、初回描画時のスタッターは数ms~数十msにおよぶとのこと。
こうしたPSO生成をゲーム起動直後など任意のタイミングで実行可能とするのが、GSCによるWarmupです。
Shader.CreateGPUProgram(Main Thread上におけるSPIR-V/MSLレベルでのシェーダーバリアントコンパイル)の処理(画像はブログ記事より引用)
PSO生成時(Render ThreadでGPUドライバーによりマシン語へ変換する処理)のコンパイル発生例(画像はブログ記事より引用)
具体的な実装手順については、PSO生成に必要なシェーダーバリアントや頂点レイアウトといった情報を記録する「レンダリング設定の収集」と、それをもとにWarmupを実行する2つのフェーズに分けて、サンプルコードを添えつつ実装例を提示しています。
また、GSCを導入してもスタッターが残ってしまった実際のケース4種類を紹介し、その原因と対処法を解説しています。
たとえば「Warmup実行時にmismatchの警告が出る」問題については、GSCファイルに保存されたメタデータが実行環境と一致しないことが原因だったといい、ファイル設定を修正することで解決。そのほか、iOS環境(Metal)でのみ発生した不具合の発生事例なども紹介しています。
実際に表示されたとしているmismatch警告。異なるプラットフォームで収集したGSCを流用していたケースなどにおいて、これらの警告が発生したという(画像はブログ記事よりスクリーンショットで引用)
詳細はブログ記事をご確認ください。
「GraphicsStateCollection を使ったシェーダーウォームアップについて」CORETECH ENGINEER BLOG