Metal är ett lågnivå grafiskt och beräknings-API från Apple som ger direkt åtkomst till GPU på iOS, macOS och tvOS. Det ersätter OpenGL och OpenCL och ger minimal CPU-overhead och förutsägbar prestanda. Enligt Apple WWDC (2025) används Metal i 98% av applikationerna med GPU-rendering i Apples ekosystem.
Huvudpunkter
Metal är ett lågnivå-API för att arbeta med grafikprocessorn (GPU), introducerat av Apple 2014 tillsammans med iOS 8 och OS X Yosemite. Metal skapades som en ersättning för OpenGL och OpenCL med målet att minska CPU-overhead och ge mer direkt åtkomst till GPU-hårdvaran på Apple-enheter.
Till skillnad från OpenGL, där drivrutinen utför flera kontroller och transformationer på CPU, använder Metal en modell med explicit resurshantering. Utvecklaren kontrollerar minnesallokering, synkronisering och sändning av GPU-kommandon, vilket ger en prestandaökning på upp till 50% jämfört med OpenGL ES på samma hårdvara.
Metal stöder alla Apple-chips, från A7 (2013) till M4 Ultra (2025). API utvecklas kontinuerligt: Metal 3 (2022) lade till stöd för mesh-shaders och ray tracing, Metal 3.1 (2023) — snabb resursdelning mellan CPU och GPU, och Metal 4 (2025) — hårdvaruacceleration av neurala nätverk på GPU med stöd för FP8 och INT4.
Den första versionen av Metal (2014) gav ett grundläggande API för grafisk rendering på iOS. Metal 2 (2017) lade till beräkningsshaders och Metal Performance Shaders. Metal 3 (2022) introducerade MetalFX Upscaling — egen uppskalningsteknik för spel, konkurrent till NVIDIA DLSS och AMD FSR. MetalFX ger en prestandaökning på upp till 2x på Mac med M2.
Metal 4 (2025) fokuserade på maskininlärning och ray tracing. Enligt Apple (2025) når Metal 4 på M4 Ultra upp till 80 TFLOPS i beräkningsuppgifter vid FP16 och stöder hårdvaruavkodning av AV1. Metal stöds nu även på Apple Vision Pro via compositor-tjänsten för rendering av immersivt innehåll.
Metal-arkitektur är byggd kring konceptet explicit hantering: utvecklaren skapar MTLDevice (enhet), MTLBuffer (databuffertar), MTLTexture (texturer) och MTLCommandQueue (kommandokö) objekt. Till skillnad från OpenGL, där tillstånd lagras i kontext, använder Metal tillståndsobjekt (state objects) som kompileras i förväg.
MTLDevice representerar en fysisk eller virtuell GPU. Alla Metal-resurser skapas genom detta objekt: buffertar, texturer, shader-bibliotek, pipelines. I system med flera GPU:er (Mac Pro) kan en specifik enhet väljas. Metoden supportsFamily: kontrollerar funktionsstöd: ray tracing, mesh-shaders, MetalFX.
import Metal
// Hämta GPU-enhet
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError("Metal stöds inte")
}
// Kontrollera funktioner
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // “Apple M4 Pro”
let maxBufferSize = device.maxBufferLength
Egenskapen maxBufferLength bestämmer den maximala buffertstorlek som enheten stöder. På Apple Silicon med Unified Memory är gränsen upp till 128 GB (på M4 Ultra). Detta möjliggör arbete med stora datamängder för ML och vetenskapliga beräkningar utan buffertsegmentering. Enheten hanterar också minnespoolen via MTLHeap.
MTLBuffer — ett sammanhängande minnesområde tillgängligt för GPU. Buffertar används för vertexdata, matriser, uniform-variabler. Lägen: shared (CPU + GPU-åtkomst i enhetligt minne), private (endast GPU, snabbare), managed (för diskreta GPU:er, med synkronisering). På Apple Silicon rekommenderas shared för enkelhet.
MTLTexture — en multidimensional pixelmatris för texturer och renderingsmål. 1D-, 2D-, 3D-, cube- och array-texturer stöds. Format: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (komprimering), djup (depth32Float) och stencil. Texture Usage-flaggor anger hur texturen ska användas: rendering, shaderläsning, kopiering.
MTLLibrary — en samling kompilerade GPU-funktioner (shaders). Biblioteket kan skapas från MSL-källkod (Metal Shading Language) under körning eller förkompileras och inkluderas i paketet (.metallib). Förkompilering rekommenderas för att eliminera förseningar i initialiseringsfasen.
MTLFunction representerar en specifik shaderfunktion. Vertex-shaders, fragment-shaders, beräknings-shaders (kernel) och mesh-shaders skapas via biblioteket. Funktioner cachas på GPU och återanvänds mellan bildrutor. Shader-argument specificeras via buffertar och texturplatser med indexbaserad bindning.
Rendering i Metal organiseras via asynkrona kommandoköer. Utvecklaren skapar en MTLCommandBuffer, kodar renderings- eller beräkningskommandon i den och skickar till MTLCommandQueue. GPU:n utför kommandona sekventiellt medan CPU:n kan fortsätta sitt arbete. Synkronisering sker via semaforer eller completionHandler.
MTLCommandQueue — en kommandokö skapad från MTLDevice. En applikation kan ha flera köer för grafik, beräkningar och kopiering. Varje kö garanterar sekventiell exekvering av kommandon. MTLCommandBuffer — en behållare för en portion GPU-arbete. Efter kodning skickas den och exekveras på GPU.
// Huvudrenderingsloop
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()
Metoden drawPrimitives utför ritning av geometri. Parametern vertexCount anger antalet vertices. För varje bildruta skapas en ny command buffer. Present synkroniserar ritningen med skärmens VSync. Metal hanterar automatiskt synkroniseringen med displayen via CAMetalLayer.
MTLRenderPipelineState — kompilerat tillstånd för renderingspipen, inklusive vertex- och fragment-shaders, depth-stencil-konfiguration, blending och utdatapixelformat. Att skapa pipeline state är en dyr operation, så objekt cachas och återanvänds. För olika shaderkombinationer skapas olika pipeline states.
Metal 3.1 introducerade snabb rendering via Immutable Samplers, som cachas på GPU för att påskynda textursampling. Metal stöder upp till 31 texturer per shaderplats i Apple Silicon-miljöer. På äldre enheter med A13 och lägre är gränsen sänkt till 16 platser. Det rekommenderas att kombinera texturer i Texture Atlases för att minska antalet samplingar.
Metal Shading Language (MSL) — ett programmeringsspråk för shaders baserat på C++14 med tillägg för GPU-beräkningar. MSL stöder mallar (templates), funktionsöverlagring, namnrymder och adressaritmetik. Shaders kompileras till binär GPU-kod via Apples LLVM-backend.
Vertex shader bearbetar varje vertex: transformerar koordinater från världsrymd till skärmrymd, beräknar normaler och skickar data till fragment-shadern. Fragment shader beräknar färgen på varje pixel: applicerar texturer, belysning och efterbehandlingseffekter.
// Metal vertex shader
#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;
}
Attributen [[attribute(N)]] motsvarar vertexformat som specificerats i MTLVertexDescriptor. Buffert [buffer(0)] skickar MVP-matrisen som en uniform-variabel. Vertexpositionen måste markeras med [[position]] för överföring till rasterizern. Alla MSL-vektortyper — float2, float3, float4 — mappas till GPU-hårdvaruregister.
Compute shader (kernel) — en GPU-funktion som exekveras utanför den grafiska pipen. Kernel-funktioner markeras med kvalificeraren kernel och exekveras i trådar (threads) organiserade i grupper (threadgroups). Beräknings-shaders används för bildbehandling, fysiksimulering, ML och efterbehandling.
// Compute kernel för bildsuddning
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);
}
Parametern gid [[thread_position_in_grid]] innehåller ett unikt trådindex. Texture2D
Metal Performance Shaders (MPS) — ett bibliotek med optimerade GPU-funktioner från Apple. MPS inkluderar konvolutionella neurala nätverk (MPSNNConvolution), matrismultiplikation (MPSMatrixMultiplication), sortering (MPSParallelSort) och bildbehandling (MPSImageGaussianBlur). Alla funktioner är optimerade för specifika Apple-GPU:er.
MetalFX — uppskalnings- och kantutjämningsteknik, konkurrent till NVIDIA DLSS och AMD FSR. MetalFX erbjuder två lägen: Spatial (rumslig uppskalning via FSR 2-algoritm) och Temporal (tidsmässig uppskalning med rörelsevektorer). Temporal MetalFX ger kvalitet nära native 4K från rendering i 1440p.
Enligt Apple (2025) ger MetalFX Temporal på M4 Max en prestandaökning på upp till 3x i spel med bibehållen kvalitet som visuellt inte går att skilja från native upplösning. MetalFX fungerar på alla GPU:er som stöder Metal 3, utan dedikerade tensor-kärnor. Integration av MetalFX i ett projekt kräver cirka 50 rader kod.
Ray Tracing i Metal 3 stöds på M3-, M4- och A17 Pro-chips med hårdvaruaccelerationsblock (Ray Tracing Accelerators). Metal tillhandahåller MTLAccelerationStructure för att bygga BVH och MTLIntersectionFunction för strålkorsning i shaders. Gigantiska scener med miljontals trianglar kompileras till BVH på millisekunder.
Enligt Apple (2025) utför hårdvaru-ray tracing på M4 Ultra upp till 40 miljarder strålkorsningar per sekund (Giga rays/s). Detta är 4 gånger snabbare än mjukvaru-ray tracing på M1 Ultra. Metal RT stöder intersection queries, dynamiska geometrier och Motion Blur för realistiska animationer. Reflektioner och skuggor med ray tracing fungerar i realtid vid 60 FPS.
Unified Memory — Apple Silicon-arkitekturen där CPU och GPU använder samma fysiska minne. Metal på Apple Silicon kräver inte kopiering av data mellan CPU och GPU: MTLBuffer i shared-läge är tillgängligt för båda processorerna utan kopiering. Detta eliminerar den största flaskhalsen hos traditionella GPU:er (PCIe-överföringar).
Zero-Copy i Metal låter CPU:n skriva data till bufferten och GPU:n läsa den utan fördröjning. Enligt Apple (2025) ger detta en prestandaökning på 30–50% jämfört med diskreta GPU:er i spel och ML-uppgifter. För diskreta GPU:er (Mac Pro med Radeon) stöder Metal managed-läge med automatisk synkronisering via memory barriers.
Vanliga frågor
Metal — Apples lågnivå-API för att arbeta med GPU, med minimal CPU-overhead. Det används för 3D-grafik, ML-beräkningar, bildbehandling och simuleringar på iOS, macOS och tvOS. Ersätter OpenGL och OpenCL.
Metal fungerar endast på Apple-enheter, är integrerat med Unified Memory och Metal Performance Shaders. Vulkan är ett plattformsoberoende API för Windows, Android och Linux. Prestandamässigt är båda API:erna jämförbara, men Metal har lägre overhead på Apple Silicon.
Ja, från Metal 3 på M3-, M4- och A17 Pro-chips finns hårdvaru-ray tracing tillgänglig. Metal tillhandahåller MTLAccelerationStructure och stöd för intersection queries i shaders. Prestanda — upp till 40 Giga rays/s på M4 Ultra.
MetalFX — Apples uppskalningsteknik med Spatial- och Temporal-lägen. Fungerar på alla GPU:er med Metal 3, utan tensor-kärnor. Ger en prestandaökning på upp till 3x med kvalitet nära native 4K på M4 Max.
Inträdes-tröskeln är högre än för SceneKit eller Unity på grund av lågnivå resurshantering. Apple tillhandahåller Metal Sample Code och handledningar på developer.apple.com. För grundläggande rendering av en triangel krävs cirka 200 rader kod.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också