ハイライト
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 を指定できる
重要ポイント
-
Acceleration Structure Viewer でレイトレーシングの問題をデバッグする。BVH のバウンディングボックスが妥当か、instance 変換が正しいかを確認する。主な API:Xcode 13 GPU Frame Capture → Acceleration Structure Viewer。
-
GPU Timeline でパフォーマンスボトルネックを特定する。最も時間のかかる pass を見つけ、十分な並列の重なりがあるか確認する。主な API:Xcode 13 → Metal GPU Timeline。
-
開発中は常に Shader Validation を有効にする。範囲外アクセスや未初期化変数などの shader bug を捕捉する。主な API:Scheme → Metal → Shader Validation。
-
texture converter でテクスチャ圧縮をビルドフローに統合する。ソーステクスチャを GPU 圧縮形式へ自動変換する。主な API:
xcrun textureconverter。 -
texture swizzle でチャンネル順序の異なるソースデータを処理する。形式ごとに個別の shader を書く必要がない。主な API:
MTLTextureDescriptor.swizzle。
関連セッション
- Optimize high-end games for Apple GPUs — Apple GPU の TBDR アーキテクチャを活用したゲーム最適化
- Enhance your app with Metal ray tracing — Metal レイトレーシング API
- Create image processing apps powered by Apple silicon — Apple Silicon 向けの画像処理最適化
コメント
GitHub Issues · utterances