Skip to content
Go back

Instancing and OIT in Total War: THREE KINGDOMS

· Updated:

slides video

拙訳

  • Game Tickは約10fps
  • メインスレッドとレンダースレッドが協調して動作する
  • Game Tickはゲーム状態を構築してメインスレッドに渡す
  • ワーカースレッドはひとつひとつが物理コアに対応する
  • メインスレッド用ワーカースレッド:
    • カリング:
      • 複数の錐台との交差判定を一括して行い、結果を64ビットで格納する
    • LODの選択:
      • バウンディングボックスを投影して小さいオブジェクトをカリングする
      • スクリーンに占めるトライアングルの近似的な平均サイズに基づいてLODレベルを決める
    • インスタンスデータ
      • メッシュタイプごとにインスタンスデータのフォーマットがある
      • 各パイプラインステージで共用
    • インスタンスリスト
      • メッシュ1つにつき、対応するパイプラインステージごとに1つのインスタンスリストを持つ
      • ロックせずにアクセスするため、ワーカースレッドごとに複製される
      • レンダリングでも使われているため、ダブルバッファにする
    • メッシュリスト
      • メッシュタイプごとに1つ
      • インスタンスを1つ以上持つメッシュはメッシュタイプに合致するメッシュリストただ1つに追加される
      • インスタンスリストと同様に、ワーカースレッドに1つのメッシュリストがあり、ダブルバッファリングされる
  • レンダースレッド用ワーカースレッド:
    • メッシュリストの結合:
      • メッシュタイプごとにタスク1つでメッシュリストを処理する
      • スレッドごとのメッシュリストを1つにまとめる
    • インスタンスリストの結合:
      • 各メッシュが持つインスタンスリストをパイプラインステージごとに1つにまとめる
      • インスタンスデータやカメラからの距離をキーとしてソートする
  • レンダリング:
    • レンダースレッドはパイプラインステージを順次処理する
    • パイプラインステージはメッシュタイプごとに分かれ、メッシュがレンダースレッド用ワーカースレッドで処理完了し次第、待機をあける
  • 統合型向け最適化
    • 行った変更のほとんどがメモリ負荷の削減だった
      • DoFパスの早期脱出で3.6msの改善
    • シェーダのレジスタの使用率も問題を引き起こし得る
      • レイマーチングのステップ数の削減で3msの改善
    • リソースのコピーも結構な時間がかかり得る
      • コピー1つで一番だったのは0.9ms
  • パーティクルシステム:
    • CPUベースから、GPUのPSベース、そして今回は、GPUのCSベース
    • 本来は、結果が変にならないようパーティクル全体をソートする必要がある
      • uberシェーダが必要になったり、ソートに時間がかかりすぎたりする問題がある
      • ソートには死んでいるパーティクルを末尾に集める役割もある
    • [McGuire and Mara 2017McGuire, M. and Mara, M. 2017. Phenomenological transparency. IEEE Transactions of Visualization and Computer Graphics 23, 5, 1465–1478. 10.1109/TVCG.2017.2656082. https://casual-effects.com/research/McGuire2017Transparency/index.html.]の WBOIT と [Münstermann et al. 2018Münstermann, C., Krumpen, S., Klein, R. and Peters, C. 2018. Moment-based order-independent transparency. Proc. ACM Comput. Graph. Interact. Tech. 1, 1. 10.1145/3203206. https://momentsingraphics.de/I3D2018.html.] の MBOIT を試した
      • WBOITは軽量だが、加算ブレンドが使えず、マジックナンバーが多くあり、不透明に近いものをうまく扱えない
      • MBOITは加算や乗算のブレンディングに対応し、調整すべきパラメータが少なく、不透明に近いものをうまく扱えるが、コストが高い(追加のパスとレンダーターゲットが必要)
    • 結果
      • 死んでいるパーティクルをまとめる以外、ソートを必要としない
      • 固定コストが減った分、パフォーマンスは変わらない
      • シェーダや解像度を色々と組み合わせられる
      • 今回はMBOITを採用