Metal是Apple提供的低层次图形和计算API,可在iOS、macOS和tvOS上直接访问GPU。它取代了OpenGL和OpenCL,提供最小的CPU开销和可预测的性能。根据Apple WWDC(2025)的数据,Metal被用于Apple生态系统中98%的GPU渲染应用程序。
核心要点
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(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架构围绕显式管理理念构建:开发者创建MTLDevice(设备)、MTLBuffer(数据缓冲区)、MTLTexture(纹理)和MTLCommandQueue(命令队列)对象。与OpenGL不同,Metal使用预先编译的状态对象。
MTLDevice代表物理或虚拟GPU。所有Metal资源通过该对象创建:缓冲区、纹理、着色器库、渲染管线。在多GPU系统中(Mac Pro)可选择特定设备。supportsFamily:方法检查功能支持:光线追踪、网格着色器、MetalFX。
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— 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—已编译的GPU函数(着色器)集合。库可以从MSL(Metal Shading Language)源代码在运行时创建或预先编译并包含在包中(.metallib)。建议预先编译以消除初始化阶段的延迟。
MTLFunction代表特定的着色器函数。顶点着色器、片段着色器、计算着色器和网格着色器通过库创建。函数在GPU上缓存并在帧之间重用。着色器参数通过缓冲区和纹理插槽按索引绑定指定。
Metal渲染通过异步命令队列组织。开发者创建MTLCommandBuffer,在其中编码渲染或计算命令并发送到MTLCommandQueue。GPU顺序执行命令,CPU可继续工作。同步通过信号量或completionHandler实现。
MTLCommandQueue—从MTLDevice创建的命令队列。应用可有多个队列分别用于图形、计算和拷贝。每个队列保证命令的顺序执行。MTLCommandBuffer—包含单批GPU工作的容器。编码后提交并在GPU上执行。
// 主渲染循环
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(MSL)— 基于C++14的着色器编程语言,具有GPU计算扩展。MSL支持模板、函数重载、名称空间和地址算术。着色器通过Apple LLVM后端编译为GPU二进制代码。
顶点着色器处理每个顶点:将坐标从世界空间转换到屏幕空间,计算法线并将数据传递给片段着色器。片段着色器计算每个像素的颜色:应用纹理、照明和后处理效果。
// 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 shader(kernel)— 在图形管线之外执行的GPU函数。Kernel函数用kernel限定符标记,在组织为线程组的线程中执行。计算着色器用于图像处理、物理模拟、ML和后处理。
// 用于模糊图像的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
Metal Performance Shaders(MPS)— Apple提供的优化GPU函数库。MPS包括卷积神经网络(MPSNNConvolution)、矩阵乘法(MPSMatrixMultiplication)、排序(MPSParallelSort)和图像处理(MPSImageGaussianBlur)。所有函数针对特定Apple GPU进行了优化。
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行代码。
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— 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— Apple的低层次GPU API,提供最小的CPU开销。用于iOS、macOS和tvOS上的3D图形、ML计算、图像处理和模拟。取代了OpenGL和OpenCL。
Metal仅在Apple设备上工作,与Unified Memory和Metal Performance Shaders集成。Vulkan是跨平台API,适用于Windows、Android和Linux。性能上两者很接近,但Metal在Apple Silicon上开销更低。
是的,从Metal 3开始,M3、M4和A17 Pro芯片支持硬件光线追踪。Metal提供MTLAccelerationStructure和着色器中的交叉查询支持。性能— M4 Ultra上达40 Giga rays/s。
MetalFX— Apple的超分辨率技术,支持Spatial和Temporal模式。无需张量核心,在任何支持Metal 3的GPU上运行。在M4 Max上提供接近原生4K质量的3倍性能提升。
由于低层次资源管理,入门门槛高于SceneKit或Unity。Apple在developer.apple.com上提供Metal Sample Code和教程。基础三角形渲染大约需要200行代码。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。