Metal — 什么是图形API和着色器

作者: IT Sectr 发布日期: 2026-05-03 阅读时间: 10 分钟

Metal是Apple提供的低层次图形和计算API,可在iOS、macOS和tvOS上直接访问GPU。它取代了OpenGL和OpenCL,提供最小的CPU开销和可预测的性能。根据Apple WWDC(2025)的数据,Metal被用于Apple生态系统中98%的GPU渲染应用程序。

核心要点

  • Metal — Apple的低层次GPU API,支持图形和计算
  • MTLDevice — GPU抽象层,所有Metal资源通过它创建
  • 命令缓冲区 MTLCommandBuffer提供多线程命令写入
  • Metal Shading Language着色器基于C++14编译为GPU代码
  • Metal Performance Shaders为ML和过滤提供优化的GPU函数

什么是Metal?

Metal是Apple在2014年随iOS 8和OS X Yosemite一起推出的低层次图形处理器(GPU)API。Metal是作为OpenGL和OpenCL的替代品而创建的,旨在降低CPU开销并在Apple设备上提供更直接的GPU硬件访问。

与OpenGL不同,Metal使用显式资源管理模型。开发者控制内存分配、同步和GPU命令发送,在相同硬件上相比OpenGL ES可提升性能达50%。

Metal支持所有Apple芯片,从A7(2013)到M4 Ultra(2025)。API持续发展:Metal 3(2022)增加了网格着色器和光线追踪支持,Metal 3.1(2023)快速CPU和GPU资源共享,Metal 4(2025)在GPU上实现神经网络硬件加速支持FP8和INT4。

Metal历史

第一版Metal(2014)为iOS提供了基础图形渲染API。Metal 2(2017)增加了计算着色器和Metal Performance Shaders。Metal 3(2022)引入MetalFX Upscaling,这是Apple自有的游戏超分辨率技术,与NVIDIA DLSS和AMF FSR竞争。MetalFX在配备M2的Mac上提升性能达2倍。

Metal 4(2025)聚焦机器学习和光线追踪。根据Apple(2025)数据,Metal 4在M4 Ultra上在FP16计算任务中达到80 TFLOPS并支持AV1硬件解码。Metal现在还通过compositor服务支持Apple Vision Pro的沉浸式内容渲染。

Metal架构:设备和资源

Metal架构围绕显式管理理念构建:开发者创建MTLDevice(设备)、MTLBuffer(数据缓冲区)、MTLTexture(纹理)和MTLCommandQueue(命令队列)对象。与OpenGL不同,Metal使用预先编译的状态对象。

MTLDevice — API入口点

MTLDevice代表物理或虚拟GPU。所有Metal资源通过该对象创建:缓冲区、纹理、着色器库、渲染管线。在多GPU系统中(Mac Pro)可选择特定设备。supportsFamily:方法检查功能支持:光线追踪、网格着色器、MetalFX。

swift
import Metal
 
// 获取GPU设备
guard let device = MTLCreateSystemDefaultDevice() else {
    fatalError("Metal不受支持")
}
 
// 检查能力
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // “Apple M4 Pro”
let maxBufferSize = device.maxBufferLength

maxBufferLength属性确定设备支持的最大缓冲区大小。在配备Unified Memory的Apple Silicon上,限制在M4 Ultra上达到128 GB。这使得无需缓冲区分段即可处理大型数据集进行ML和科学计算。设备还通过MTLHeap管理内存池。

MTLBuffer和MTLTexture — GPU数据

MTLBuffer— GPU可访问的连续内存区域。缓冲区用于顶点数据、矩阵、uniform变量。模式:shared(CPU + GPU在统一内存中访问)、private(仅GPU,更快)、managed(针对离散GPU,带同步)。在Apple Silicon上推荐shared模式以简化。

MTLTexture—纹理和渲染目标的多维像素数组。支持1D、2D、3D、cube和array纹理。格式:RGBA8Unorm、BGRA8Unorm、RGBA16Float、R32Float、ASTC(压缩)、深度(depth32Float)和模板。Texture Usage标志指示纹理的用途:渲染、着色器读取、拷贝。

MTLLibrary和着色器编译

MTLLibrary—已编译的GPU函数(着色器)集合。库可以从MSL(Metal Shading Language)源代码在运行时创建或预先编译并包含在包中(.metallib)。建议预先编译以消除初始化阶段的延迟。

MTLFunction代表特定的着色器函数。顶点着色器、片段着色器、计算着色器和网格着色器通过库创建。函数在GPU上缓存并在帧之间重用。着色器参数通过缓冲区和纹理插槽按索引绑定指定。

通过Metal渲染:命令缓冲区

Metal渲染通过异步命令队列组织。开发者创建MTLCommandBuffer,在其中编码渲染或计算命令并发送到MTLCommandQueue。GPU顺序执行命令,CPU可继续工作。同步通过信号量或completionHandler实现。

MTLCommandQueue和MTLCommandBuffer

MTLCommandQueue—从MTLDevice创建的命令队列。应用可有多个队列分别用于图形、计算和拷贝。每个队列保证命令的顺序执行。MTLCommandBuffer—包含单批GPU工作的容器。编码后提交并在GPU上执行。

swift
// 主渲染循环
let commandQueue = device.makeCommandQueue()!
 
guard let commandBuffer = commandQueue.makeCommandBuffer()
else { return }
 
guard let descriptor = currentDrawable.texture.makeRenderPassDescriptor(
    attachment: 0
) else { return }
 
let encoder = commandBuffer.makeRenderCommandEncoder(
    descriptor: descriptor
)!
encoder.setRenderPipelineState(pipelineState)
encoder.drawPrimitives(type: .triangle,
    vertexStart: 0, vertexCount: 36)
encoder.endEncoding()
 
commandBuffer.present(currentDrawable)
commandBuffer.commit()

drawPrimitives方法执行几何图形绘制。vertexCount参数指定顶点数。每帧创建新的command buffer。Present将绘制与屏幕VSync同步。Metal通过CAMetalLayer自动管理与显示器的同步。

渲染管线状态

MTLRenderPipelineState—渲染管线的编译状态,包括顶点和片段着色器、深度模板配置、混合和输出像素格式。创建pipeline state是成本高昂的操作,因此对象会缓存并重用。不同着色器组合使用不同的pipeline states。

Metal 3.1引入了通过Immutable Samplers的快速渲染,这些Samplers在GPU上缓存以加快纹理采样。Metal在Apple Silicon环境中每个着色器插槽支持最多31个纹理。在配备A13及更早版本的设备上,限制降低到16个插槽。建议将纹理合并到Texture Atlases中以减少采样数。

Metal Shading Language和着色器

Metal Shading Language(MSL)— 基于C++14的着色器编程语言,具有GPU计算扩展。MSL支持模板、函数重载、名称空间和地址算术。着色器通过Apple LLVM后端编译为GPU二进制代码。

顶点和片段着色器

顶点着色器处理每个顶点:将坐标从世界空间转换到屏幕空间,计算法线并将数据传递给片段着色器。片段着色器计算每个像素的颜色:应用纹理、照明和后处理效果。

cpp
// Metal顶点着色器
#include <metal_stdlib>
using namespace metal;
 
struct VertexIn {
    float3 position [[attribute(0)]];
    float3 normal   [[attribute(1)]];
};
 
struct VertexOut {
    float4 position [[position]];
    float3 worldNormal;
};
 
vertex VertexOut vertexMain(
    VertexIn in [[stage_in]],
    constant float4x4 &mvp [[buffer(0)]]
) {
    VertexOut out;
    out.position = mvp * float4(in.position, 1.0);
    out.worldNormal = in.normal;
    return out;
}

[[attribute(N)]]属性对应MTLVertexDescriptor中指定的顶点格式。[buffer(0)]缓冲区作为uniform变量传递MVP矩阵。顶点位置必须用[[position]]标记以传递给光栅化器。所有MSL向量类型(float2、float3、float4)映射到GPU硬件寄存器。

计算着色器(Compute Kernels)

Compute shader(kernel)— 在图形管线之外执行的GPU函数。Kernel函数用kernel限定符标记,在组织为线程组的线程中执行。计算着色器用于图像处理、物理模拟、ML和后处理。

cpp
// 用于模糊图像的Compute kernel
kernel void blurKernel(
    texture2d<half> input  [[texture(0)]],
    texture2d<half> output [[texture(1)]],
    constant float &radius  [[buffer(0)]],
    uint2 gid [[thread_position_in_grid]]
) {
    if (gid.x >= input.get_width() ||
        gid.y >= input.get_height()) { return; }
    half4 color = input.read(gid);
    output.write(color, gid);
}

gid [[thread_position_in_grid]]参数包含唯一的线程索引。Texture2D根据像素类型专用化:half(FP16)、float(FP32)。Compute kernels在M4 Ultra上可以网格大小超过10亿线程启动。Apple Silicon GPU上最大threadgroup大小为1024线程。

性能和Metal Performance Shaders

Metal Performance Shaders(MPS)— Apple提供的优化GPU函数库。MPS包括卷积神经网络(MPSNNConvolution)、矩阵乘法(MPSMatrixMultiplication)、排序(MPSParallelSort)和图像处理(MPSImageGaussianBlur)。所有函数针对特定Apple GPU进行了优化。

MetalFX Upscaling

MetalFX— 超分辨率和抗锯齿技术,与NVIDIA DLSS和AMF FSR竞争。MetalFX提供两种模式:Spatial(通过FSR 2算法的空间超分辨率)和Temporal(带运动向量的时序超分辨率)。Temporal MetalFX从1440p渲染提供接近原生4K的质量。

根据Apple(2025)数据,MetalFX Temporal在M4 Max上在游戏中提升性能达3倍,同时保持与原生分辨率视觉上无差异的质量。MetalFX无需专用张量核心,在任何支持Metal 3的GPU上运行。将MetalFX集成到项目中大约需要50行代码。

Metal中的光线追踪

Ray Tracing在Metal 3中支持M3、M4和A17 Pro芯片的硬件加速区块。Metal提供MTLAccelerationStructure用于构建BVH和MTLIntersectionFunction用于着色器中的光线交叉。拥有数百万三角形的巨型场景在毫秒内编译为BVH。

根据Apple(2025)数据,M4 Ultra上的硬件光线追踪每秒执行达400亿次光线交叉(Giga rays/s)。这比M1 Ultra上的软件光线追踪快4倍。Metal RT支持交叉查询、动态几何和运动模糊。光线追踪反射和阴影在实时60 FPS下运行。

Unified Memory和Zero-Copy

Unified Memory— Apple Silicon架构,CPU和GPU使用相同的物理内存。Apple Silicon上的Metal不需要在CPU和GPU之间拷贝数据:shared模式下的MTLBuffer可无拷贝地被两个处理器访问。这消除了传统GPU的主要瓶颈(PCIe传输)。

Metal中的Zero-Copy允许CPU向缓冲区写入数据,GPU无延迟读取。根据Apple(2025)数据,这在游戏和ML任务中对比离散GPU提升性能30–50%。对于离散GPU(搭载Radeon的Mac Pro),Metal支持带内存障碍的自动同步managed模式。

常见问题

什么是Metal,它有什么用?

Metal— Apple的低层次GPU API,提供最小的CPU开销。用于iOS、macOS和tvOS上的3D图形、ML计算、图像处理和模拟。取代了OpenGL和OpenCL。

Metal和Vulkan有什么区别?

Metal仅在Apple设备上工作,与Unified Memory和Metal Performance Shaders集成。Vulkan是跨平台API,适用于Windows、Android和Linux。性能上两者很接近,但Metal在Apple Silicon上开销更低。

Metal支持光线追踪吗?

是的,从Metal 3开始,M3、M4和A17 Pro芯片支持硬件光线追踪。Metal提供MTLAccelerationStructure和着色器中的交叉查询支持。性能— M4 Ultra上达40 Giga rays/s。

什么是MetalFX Upscaling?

MetalFX— Apple的超分辨率技术,支持Spatial和Temporal模式。无需张量核心,在任何支持Metal 3的GPU上运行。在M4 Max上提供接近原生4K质量的3倍性能提升。

开始使用Metal难吗?

由于低层次资源管理,入门门槛高于SceneKit或Unity。Apple在developer.apple.com上提供Metal Sample Code和教程。基础三角形渲染大约需要200行代码。

总结

  • Metal — Apple的低层次GPU API,最小化CPU开销
  • MTLDeviceMTLCommandQueue — 显式资源管理架构的基础
  • MTLCommandBuffer和编码器实现多线程GPU命令写入
  • Metal Shading Language(C++14)支持顶点、片段、计算和网格着色器
  • MetalFX — 在任何支持Metal 3的GPU上提升达3倍的超分辨率
  • 硬件光线追踪 可用于M3/M4/A17 Pro
  • Unified Memory 在Apple Silicon上消除了CPU和GPU之间的数据拷贝

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读