WWDC Quick Look 💓 By SwiftGGTeam
Discover Metal debugging, profiling, and asset creation tools

Discover Metal debugging, profiling, and asset creation tools

元の動画を見る

ハイライト

Xcode 13 の Metal Debugger には Acceleration Structure Viewer、GPU Timeline、shader validation、texture converter が追加され、レイトレーシングのデバッグ、パフォーマンス分析、アセット作成の一連の流れをカバーする。

主な内容

Metal アプリでレンダリングの問題が発生している。画面にアーティファクトが出る、または特定のシーンでフレームレートが急に落ちる。問題の所在を特定するにはツールが必要だ。shader の誤りなのか、リソースバインディングの問題なのか、それとも GPU のパフォーマンスボトルネックなのか。

Xcode 13 の Metal Debugger は大きく更新され、レイトレーシング、パフォーマンス分析、テクスチャ処理をカバーする。

詳細

Acceleration Structure Viewer

01:25

レイトレーシングの加速構造はブラックボックスで、問題が起きるとデバッグが難しい。Xcode 13 には Acceleration Structure Viewer が追加され、BVH の階層構造を可視化できる。

GPU Frame Capture で ray tracing dispatch を選択し、Bound Resources から acceleration structure を見つけてクリックすると Viewer を開ける。

Viewer の左側には instance の階層ツリーが表示され、右側には 3D プレビューが表示される。特定の instance をクリックすると、そのバウンディングボックス、primitive 数、変換行列を確認できる。

02:00

キーポイント:

  • GPU Frame Capture 内で acceleration structure を確認する
  • 左側のツリー構造に instance 階層が表示される
  • 右側の 3D ビューにジオメトリが表示される
  • 各 instance のバウンディングボックスと変換を確認できる

GPU Timeline

04:30

GPU Timeline は Xcode 13 の新しいパフォーマンス分析ビューだ。GPU 作業の実行過程をタイムライン形式で表示する。

タイムラインには次の情報が表示される。

  • 各 render pass と compute dispatch の開始時刻と継続時間
  • メモリ帯域幅の使用状況
  • tile メモリの圧力
  • 各ステージ間の重なり具合

タイムラインを見ることで、どの pass が最も時間を使っているか、GPU にアイドル周期があるか、帯域幅がボトルネックになっているかを判断できる。

05:15

キーポイント:

  • タイムラインは GPU 作業の実際の実行順序を表示する
  • 拡大して個別 pass の詳細を確認できる
  • 色分けにより作業タイプ(render/compute/blit)を示す
  • GPU counters と組み合わせて具体的な指標を確認する

Shader Validation

08:20

Xcode 13 は shader validation のカバー範囲を拡張し、次の検出を追加した。

  • 範囲外メモリアクセス
  • 初期化されていない変数の使用
  • ゼロ除算エラー
  • NaN/Inf の伝播

有効化するには、Scheme の Metal オプションで “Shader Validation” にチェックを入れる。

09:10

キーポイント:

  • 開発中は有効にし、リリース時は無効にする
  • 一定のパフォーマンスコストがある
  • リリースビルドで再現しにくい shader bug を捕捉できる
  • vertex、fragment、compute shader に対応する

Texture Converter

12:00

Xcode 13 にはコマンドラインのテクスチャ変換ツールが追加され、すべてのモダン GPU テクスチャ形式に対応している。

# PNG を ASTC 圧縮テクスチャへ変換
xcrun textureconverter input.png -o output.astc -f ASTC_4x4_LDR

# HDR 画像を RGBM エンコードへ変換
xcrun textureconverter input.hdr -o output.rgbm -f RGBM

27:51

RGBM エンコードは HDR 値を RGBA8 テクスチャ内にエンコードする。

// RGBM エンコード
float4 encodeRGBM(float3 hdrColor) {
    float maxRGB = max(hdrColor.r, max(hdrColor.g, hdrColor.b));
    float M = saturate(maxRGB / 6.0);
    M = ceil(M * 255.0) / 255.0;
    float3 rgb = hdrColor / (M * 6.0);
    return float4(rgb, M);
}

// RGBM デコード
float3 decodeRGBM(float4 rgbm) {
    return rgbm.rgb * (rgbm.a * 6.0);
}

28:41

キーポイント:

  • コマンドラインツールは Xcode ツールチェーンに統合されている
  • ASTC、BC、PVRTC などの圧縮形式に対応する
  • RGBM エンコードにより、HDR テクスチャを 8-bit で保存できる
  • ビルドスクリプトへ統合できる

Metal Texture Swizzles

30:55

テクスチャ swizzle を使うと、サンプリング時にチャンネル順序を並べ替えられ、shader コードを変更する必要がない。

let descriptor = MTLTextureDescriptor()
descriptor.swizzle = MTLTextureSwizzleChannels(
    red: .blue,
    green: .red,
    blue: .green,
    alpha: .one
)

30:55

キーポイント:

  • テクスチャ作成時に swizzle を設定する
  • すべてのサンプリング操作に自動適用される
  • 形式の異なるソースデータの処理に適している
  • ランタイムコストはゼロ

Reconstruct Normal from Height

31:55

Xcode 13 の texture converter は、height map から normal map を生成できる。

xcrun textureconverter height.png -o normal.astc -f ASTC_4x4_LDR --generate-normal-map

31:55

キーポイント:

  • 単一チャンネルの height map から 3 チャンネルの normal map を生成する
  • 複数の圧縮形式での出力に対応する
  • height scale と wrap mode を指定できる

重要ポイント

  1. Acceleration Structure Viewer でレイトレーシングの問題をデバッグする。BVH のバウンディングボックスが妥当か、instance 変換が正しいかを確認する。主な API:Xcode 13 GPU Frame Capture → Acceleration Structure Viewer。

  2. GPU Timeline でパフォーマンスボトルネックを特定する。最も時間のかかる pass を見つけ、十分な並列の重なりがあるか確認する。主な API:Xcode 13 → Metal GPU Timeline。

  3. 開発中は常に Shader Validation を有効にする。範囲外アクセスや未初期化変数などの shader bug を捕捉する。主な API:Scheme → Metal → Shader Validation。

  4. texture converter でテクスチャ圧縮をビルドフローに統合する。ソーステクスチャを GPU 圧縮形式へ自動変換する。主な API:xcrun textureconverter

  5. texture swizzle でチャンネル順序の異なるソースデータを処理する。形式ごとに個別の shader を書く必要がない。主な API:MTLTextureDescriptor.swizzle

関連セッション

コメント

GitHub Issues · utterances