Com2uS、Vulkan を使用してグラフィックスを改善

Com2uS Chronicles のゲームタイトルのロゴのスクリーンショット。

Com2uS の Summoners War: Chronicles US(WW)KR では、Android でのレンダリングに Vulkan のみを使用し、パフォーマンスが最大 30% 向上しています。

Vulkan は、デバイスのグラフィック ハードウェアとゲームの間の抽象化を最小限に抑えるために設計された最新のクロス プラットフォーム 3D グラフィック API です。Vulkan は OpenGL ES と比較して CPU オーバーヘッドが少なく、Vulkan はより幅広い機能を提供します。

図 1. ゲーム内のスクリーンショット。
図 2.ゲーム内動画

レンダリング機能

Com2uS は、サマナーズウォー: クロニクルの次のような高度なレンダリング機能を開発しました。

  • プリレンダリングされる光カリングと、ビュー視錐台内の最大 16 個のアクティブ ライトを同時に使用するカスタムの遅延レンダリング システム
  • 多数のメッシュ、マテリアル、テクスチャを一度に描画する間接レンダリング インスタンス化メソッド(Clay
  • プリレンダリング タスクにコンピューティング シェーダーを幅広く活用
  • カメラの移動、グラフィック オプション、ランタイム パフォーマンスに基づいて、アクティブなシャドウ レンダリングと後処理効果を動的に調整する機能

モバイル ハードウェア対応

サマナーズウォー: クロニクルは、Android デバイス、パソコン、専用ゲーム機で同じレンダラを使用します。Com2uS は、モバイル ハードウェアで最適なパフォーマンスを実現するために、描画の深度や密度などのレンダリング設定を調整しました。Android 11(API レベル 30)以前を搭載している特定のデバイスに対応するため、Com2uS は一部のシェーダーの代替バージョンを作成し、インスタンス数を削減しました。また、サマナーズウォー: クロニクルは、Android の適応型パフォーマンス機能を使用して、デバイスの温度状態に応じてグラフィック オプションを動的に調整します。

Vulkan のみの理由

Com2uS は、いくつかの理由から、サマナーズウォー: クロニクル専用に Vulkan を使用していました。

  • デバイスの最小要件は、Vulkan のサポートがない旧式で性能の低いデバイスは除外されました。
  • Unity エンジンのカスタマイズ。ゲームの Vulkan バックエンドでのみ使用できる組み込みレンダリング パイプライン(BiRP)の必須機能
  • コンピューティング シェーダー出力とシェーダー ストレージ バッファ オブジェクト(SSBO)を使用するレンダリング機能の実装は Vulkan では可能ですが、OpenGL ES ではできません。

コンピューティング ワークロード

「サマナーズウォー: クロニクル」は、レンダリング用のデータを生成する際に、重要なコンピューティング シェーダー処理を行います。コンピューティング シェーダーは次の目的で使用されます。

  • オブジェクト カリング
  • 衝突点検
  • アニメーション タスク
  • 間接レンダリング データの生成

生成されたコンピューティング データは Unity エンジンの RWBuffer オブジェクトに書き込まれます。最適なパフォーマンスを実現するため、サマナーズウォー: クロニクルはすべてのコンピューティング ジョブを 1 回のディスパッチで実行し、複数の RWBuffers を同時に使用する必要があります。Unity BiRP OpenGL ES バックエンドでは一度に 1 つの RWBuffer しか使用できないため、このアプローチは Vulkan でのみ可能でした。

レンダリング用に生成されるデータセットは、多くの場合、ユニフォーム バッファ オブジェクト(UBO)のデバイスサイズ制限よりも大きくなります。サマナーズウォー: クロニクルは、代わりに容量上限が大きいシェーダー ストレージ バッファ オブジェクト(SSBO)を使用します。ただし、SSBO を頂点ステージ オペレーションにバインドするには、読み取り専用の SSBO サポートが必要です。OpenGL ES は読み取り / 書き込み SSBO のみをサポートしますが、Vulkan は SSBO を読み取り専用としてマークできます。

クレイを使用した間接インスタンス レンダリング

Com2uS は、サマナーズウォー: クロニクルのために、複数のマテリアル、メッシュ、テクスチャを 1 回の描画呼び出しでバッチ処理する方法を開発しました。Com2uS では、このシステムを「クレイ」と呼んでいます。Clay は描画呼び出しを大幅に削減した結果、ゲームのパフォーマンスを 30% 向上させました。

クレイは、キュリングと衝突のフェーズで、互換性のある表示可能なレンダリング可能なオブジェクトのリストを構築することによって開始します。Clay は識別された各オブジェクトのレンダリング情報を SSBO に生成します。このプロセスはコンピューティング シェーダーで実行されます。これにより、Unity レンダラの DrawMeshInstancedIndirect 関数を使用して間接インスタンス レンダリングを使用できるようになります。間接レンダリングでは、インスタンス情報とインスタンス数のパラメータが GPU で直接生成されます。オブジェクトを描画する際、Clay は従来のオブジェクト メッシュをバインドする代わりに、図のようにコーンメッシュをバインドします。

図 3. コーンメッシュ

Clay は、コンピューティング シェーダーで生成された頂点変換データのバインドされた SSBO を使用して、頂点シェーダー内のコーンメッシュを変換します。SSBO を頂点ステージにバインドするには、Vulkan を使用する必要があります。複数の変換コーンを使って 1 つのオブジェクトをレンダリングできますオブジェクトの複雑さによってコーンの数が決まります。

図 4. コーンメッシュからツリーへの変換方法

オブジェクトのマテリアル データは、コンピューティング シェーダーによって生成された別のバッファでバッチ処理されます。バッファはフラグメント シェーダーにバインドされます。描画されるオブジェクトのテクスチャは、テクスチャ配列として設定されます。オブジェクトのテクスチャの配列インデックスは、オブジェクトのマテリアル データに含まれています。理想的な状況では、Clay は最大 7 回の描画呼び出しでレンダリングできます。

  • 静的オブジェクト
  • アニメーション オブジェクト
  • シャドウ(4 回反復)
  • 気分

Unity と Vulkan

サマナーズウォー: クロニクル」では、Unity ゲームエンジンと Vulkan Graphics API の強力な組み合わせにより、デベロッパーが高度なコンソール品質のグラフィックを Android デバイスに提供できることが示されています。