Highlight
Metal 3 引入快速资源加载、离线编译、MetalFX Upscaling、Mesh Shaders、优化后的光线追踪和机器学习加速,并在 Xcode 14 中提供新的依赖视图和加速结构查看器。
核心内容
现代游戏和专业图形应用的瓶颈不只在渲染。纹理流式加载会卡在大量小文件请求;首次创建 pipeline state object 可能造成掉帧;高分辨率渲染需要更多像素预算;复杂几何处理常常要先跑 compute pass 再把中间结果写回显存。
Metal 3 把这些问题拆成几个可落地的新能力:资源加载进入 Metal 命令模型,shader 二进制提前到构建期生成,MetalFX 用较低分辨率换取高质量输出,Mesh Shaders 把几何处理放进渲染管线内部。
这场 session 是 Metal 3 总览。它不展开每个 API 的完整用法,而是说明每个能力解决的具体性能问题,并指向后续专题 session。
详细内容
Metal 3 设备能力检查
(00:01)在使用 Metal 3 功能前,先检查设备是否支持 .metal3 family。
if device.supportsFamily(.metal3) {
// My awesome Metal 3 renderer
}
关键点:
device是MTLDevicesupportsFamily(.metal3)查询当前 GPU 是否支持 Metal 3 功能集- 条件内部放置 Metal 3 专属渲染路径
- 不支持时需要保留降级渲染路径
快速资源加载
(01:25)Metal 3 fast resource loading 把很多小文件加载请求变成 Metal 命令。每个请求都是 command,可以排队异步提交,并直接加载到 Metal buffer 和 texture 中。
纹理流式加载的传统流程有四步:根据上一帧反馈决定加载内容、从文件加载 tile、从 staging area 拷贝到 sparse texture、绘制当前帧。加载和拷贝越慢,应用用低质量纹理绘制的时间越长。fast resource loading 减少中间步骤,并让存储硬件队列保持足够请求量。
离线编译
(03:36)传统 Metal pipeline 创建时会生成 GPU-specific shader binary。这个操作可能发生在应用启动加载阶段,也可能在帧内创建新 pipeline 时发生,导致首启等待或帧率抖动。
Metal 3 offline compilation 将 shader binary 生成移到项目构建时。运行时创建 pipeline state object 更快,首次进入场景和动态创建 pipeline 时更少卡顿。
MetalFX Upscaling
(06:04)MetalFX Upscaling 提供平台优化的超分辨率和抗锯齿。应用以较低分辨率生成像素,再由 MetalFX 生成高质量高分辨率图像。它支持 temporal 和 spatial 算法组合,目标是在更低成本下获得更高帧率。
Mesh Shaders
(07:03)传统图形管线中,顶点独立读取、变换、输出,再由固定功能硬件组装 primitive。做 GPU-driven culling、LOD 选择或程序化几何时,常需要 compute pass 先生成可变数量的中间几何并写入 device memory。
Metal mesh shaders 用两阶段模型替代传统 vertex stage:Object stage 先分析整个对象,决定是否扩展、收缩或细化;Mesh stage 生成实际几何。两个阶段都在 render pass 内运行,避免中间几何写回显存。
光线追踪、机器学习和工具
(09:34)Metal 3 优化了 acceleration structure build、intersection 和 shading。Indirect Command Buffer 支持 ray tracing 后,CPU 上的 culling 可以移动到 GPU。
(10:36)Metal 3 也加速机器学习。Mac Studio M1 Ultra 上,TensorFlow 训练相对 CPU 最高可达 16 倍加速;PyTorch 使用 Metal GPU 加速后,BERT 训练可达 6.5 倍,ResNet50 可达 8.5 倍。
(13:20)Xcode 14 的 Metal Dependency Viewer 可查看整个 renderer 或单个 pass,并显示同步边。Acceleration Structure Viewer 可以高亮 primitive,查看 primitive data,并可视化不同时间点的运动信息。
核心启发
-
为开放世界游戏改造纹理流式加载:用 fast resource loading 直接把 tile 加载到 Metal texture,减少 staging 拷贝。场景快速移动时能更快替换低质量纹理,提升画面稳定性。
-
把 pipeline 编译移出首帧:使用 offline compilation 在构建期生成 shader binary。启动时批量创建 pipeline state object 的等待变短,游戏首次进入新场景时减少掉帧。
-
用 MetalFX 换取更高帧率:在 Retina 屏幕上用较低分辨率渲染 3D 场景,再用 MetalFX 输出高分辨率画面。适合赛车、动作游戏和实时预览工具。
-
把几何裁剪移动到 Mesh Shaders:大规模场景中用 Object stage 先判断对象是否需要展开,用 Mesh stage 生成可见几何。适合程序化地形、粒子群和大量实例的 LOD 选择。
-
用 Xcode 14 检查渲染依赖:在复杂 renderer 中用 Dependency Viewer 查看 pass 之间的同步边,避免 fast resource loading、compute 和 render pass 之间的隐藏等待。
关联 Session
- Load resources faster with Metal 3 — 深入讲解 Metal 3 快速资源加载
- Target and optimize GPU binaries with Metal 3 — 将 shader binary 生成移动到构建期
- Boost performance with MetalFX Upscaling — 使用 MetalFX 提升渲染性能
- Accelerate machine learning with Metal — 用 Metal 加速机器学习训练
评论
GitHub Issues · utterances