Skip to content

第11回 品質とパフォーマンス

前回: 第10回 レイトレースの原理

今回の授業内容

  • GPU 処理時間を基準にシェーダーの負荷を比較する
  • ステップ数、サンプル数、分岐、テクスチャー参照の影響を分ける
  • halffloat の使い分けを確認する
  • 内部解像度を下げてフルスクリーン処理を軽量化する
  • 低、中、高の品質プリセットを設計する

必ず計測してから改善する

コードが長いことと GPU 負荷が高いことは同じではありません。実際に何回実行されるか、画面の何ピクセルを処理するか、メモリから何回値を読むかが影響します。

比較時は、カメラ、解像度、シーン、実行時間をそろえ、一度に1つの設定だけを変えます。

負荷の内訳を切り分ける

項目主な影響軽減方法
レイマーチのステップMapScene の反復最大距離、バウンディング、早期終了
ボリュームのサンプル密度とノイズの反復大きな歩幅、Alphaによる早期終了
ソフトシャドウ追加のレイマーチステップ削減、距離制限
フルスクリーン全ピクセルで実行内部解像度を下げる
半透明Overdraw画面占有を減らす、表示順を調整

可視化を計測に使う

レイマーチの反復回数を色で表示すると、どの場所に計算が集中しているか分かります。

hlsl
float ratio = (float)steps / (float)MAX_STEPS;
float3 heatmap = lerp(float3(0.0, 0.2, 1.0), float3(1.0, 0.0, 0.0), ratio);

距離場の表面付近や、細かい形状の間で反復が増えることを確認します。

精度と解像度

half は色や正規化後の値に適する場合があります。一方、ワールド座標、長距離の累積、SDF の表面判定は誤差の影響が大きいため float を使います。

フルスクリーン効果はピクセル数に応じて負荷が増えます。半分の幅と高さで描画すると、ピクセル数は約4分の1になります。アップスケール時のぼけや輪郭とトレードオフです。

実習:同じシーンで計測する

  1. 第07回のボリュームまたは第09回の水面を選ぶ
  2. Profiler で CPU と GPU のフレーム時間を確認する
  3. Frame Debugger で描画順とパスを確認する
  4. ステップ数を変えて、複数フレームの安定値を記録する
  5. 影、AO、追加ノイズを1つずつ無効化する
  6. 内部解像度または Render Scale を変える
  7. 見た目と GPU 時間を表にまとめる

授業内課題:品質プリセットを作る

項目
ステップ数
影ステップ
ノイズ Octaves
内部解像度
GPU時間

低品質でも表現の主要なシルエットと動きは残します。細かな影、追加ノイズ、内部解像度の順など、作品の意図に応じて何を削るか決めます。

完成条件

  • 比較条件をそろえて GPU 時間を記録している
  • 負荷の主要因を1つずつ無効化して切り分けている
  • 低、中、高の品質プリセットがある
  • 採用した値と、削った品質を説明できる

今回のまとめ

最適化は見た目を無条件に削る作業ではありません。表現の目的を残しながら、実際の計測でボトルネックを探し、品質と処理量の組み合わせを設計する作業です。

次回: 第12回 統合制作