Metal ist eine Low-Level-Grafik- und Compute-API von Apple, die direkten Zugriff auf die GPU unter iOS, macOS und tvOS ermöglicht. Sie ersetzt OpenGL und OpenCL und bietet minimale CPU-Überlastung und vorhersagbare Leistung. Laut Apple WWDC (2025) wird Metal in 98% der Anwendungen mit GPU-Rendering im Apple-Ökosystem verwendet.
Wichtige Punkte
Metal ist eine Low-Level-API für die Arbeit mit der Grafikprozessoreinheit (GPU), die von Apple 2014 zusammen mit iOS 8 und OS X Yosemite eingeführt wurde. Metal wurde als Ersatz für OpenGL und OpenCL entwickelt, um die CPU-Überlastung zu reduzieren und einen direkteren Zugriff auf die GPU-Hardware auf Apple-Geräten zu ermöglichen.
Anders als OpenGL, wo der Treiber viele Prüfungen und Transformationen auf der CPU durchführt, verwendet Metal ein Modell der expliziten Ressourcenverwaltung. Der Entwickler kontrolliert Speicherzuweisung, Synchronisation und GPU-Befehlseinreichung, was eine Leistungssteigerung von bis zu 50% gegenüber OpenGL ES auf derselben Hardware ermöglicht.
Metal unterstützt alle Apple-Chips vom A7 (2013) bis zum M4 Ultra (2025). Die API entwickelt sich ständig weiter: Metal 3 (2022) fügte Mesh-Shader und Raytracing-Unterstützung hinzu, Metal 3.1 (2023) — schnelle Ressourcenfreigabe zwischen CPU und GPU, und Metal 4 (2025) — Hardwarebeschleunigung neuronaler Netze auf der GPU mit FP8- und INT4-Unterstützung.
Die erste Version von Metal (2014) bot eine grundlegende API für Grafik-Rendering auf iOS. Metal 2 (2017) fügte Compute-Shader und Metal Performance Shaders hinzu. Metal 3 (2022) führte MetalFX Upscaling ein — Apples eigenes Upscaling für Spiele, konkurrierend mit NVIDIA DLSS und AMD FSR. MetalFX bietet bis zu 2x Leistungssteigerung auf dem Mac mit M2.
Metal 4 (2025) konzentrierte sich auf maschinelles Lernen und Raytracing. Laut Apple (2025) liefert Metal 4 auf dem M4 Ultra bis zu 80 TFLOPS bei Rechenaufgaben mit FP16 und unterstützt Hardware-AV1-Dekodierung. Metal wird jetzt auch auf Apple Vision Pro über den Compositor-Dienst zum Rendern von immersiven Inhalten unterstützt.
Die Metal-Architektur ist um das Konzept der expliziten Verwaltung aufgebaut: Der Entwickler erstellt MTLDevice-Objekte (Gerät), MTLBuffer (Datenbuffer), MTLTexture (Texturen) und MTLCommandQueue (Befehlswarteschlange). Anders als bei OpenGL, wo der Zustand im Kontext gespeichert wird, verwendet Metal Zustandsobjekte, die im Voraus kompiliert werden.
MTLDevice repräsentiert eine physische oder virtuelle GPU. Alle Metal-Ressourcen werden über dieses Objekt erstellt: Buffer, Texturen, Shader-Bibliotheken, Pipelines. Auf Systemen mit mehreren GPUs (Mac Pro) kann ein bestimmtes Gerät ausgewählt werden. Die Methode supportsFamily: prüft die Funktionsunterstützung: Raytracing, Mesh-Shader, MetalFX.
import Metal
// GPU-Gerät abrufen
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError("Metal wird nicht unterstützt")
}
// Funktionen prüfen
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // "Apple M4 Pro"
let maxBufferSize = device.maxBufferLength
Die Eigenschaft maxBufferLength bestimmt die maximale Puffergröße, die das Gerät unterstützt. Auf Apple Silicon mit Unified Memory beträgt das Limit bis zu 128 GB (auf M4 Ultra). Dies ermöglicht das Arbeiten mit großen Datensätzen für ML und wissenschaftliches Rechnen ohne Puffersegmentierung. Das Gerät verwaltet auch den Speicherpool über MTLHeap.
MTLBuffer — ein zusammenhängender Speicherbereich, der von der GPU zugänglich ist. Buffer werden für Vertex-Daten, Matrizen, Uniform-Variablen verwendet. Modi: shared (CPU + GPU-Zugriff auf einheitlichem Speicher), private (nur GPU, schneller), managed (für diskrete GPUs, mit Synchronisation). Auf Apple Silicon wird shared-Modus aus Einfachheit empfohlen.
MTLTexture — ein mehrdimensionales Pixel-Array für Texturen und Render Targets. Unterstützt 1D-, 2D-, 3D-, Cube- und Array-Texturen. Formate: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (komprimiert), Tiefe (depth32Float) und Stencil. Texture-Usage-Flags geben an, wie die Textur verwendet wird: Rendering, Shader-Lesen, Kopieren.
MTLLibrary — eine Sammlung kompilierter GPU-Funktionen (Shader). Eine Bibliothek kann zur Laufzeit aus MSL-Quellcode (Metal Shading Language) erstellt oder vorcompiliert und im Bundle (.metallib) enthalten sein. Vorcompilierung wird empfohlen, um Verzögerungen bei der Initialisierung zu vermeiden.
MTLFunction repräsentiert eine bestimmte Shader-Funktion. Vertex-Shader, Fragment-Shader, Compute-Kernel und Mesh-Shader werden über die Bibliothek erstellt. Funktionen werden auf der GPU zwischengespeichert und zwischen Frames wiederverwendet. Shader-Argumente werden über Buffer und Textur-Slots mit indexbasierter Bindung übergeben.
Das Rendering in Metal wird über asynchrone Befehlswarteschlangen organisiert. Der Entwickler erstellt MTLCommandBuffer, codiert Rendering- oder Compute-Befehle darin und sendet sie an MTLCommandQueue. Die GPU führt die Befehle sequenziell aus, während die CPU weiterarbeiten kann. Die Synchronisation erfolgt über Semaphore oder completionHandler.
MTLCommandQueue — eine aus MTLDevice erstellte Befehlswarteschlange. Eine Anwendung kann mehrere Warteschlangen für Grafik, Compute und Kopiervorgänge haben. Jede Warteschlange garantiert die sequenzielle Ausführung von Befehlen. MTLCommandBuffer — ein Container für eine Portion GPU-Arbeit. Nach der Codierung wird er committet und auf der GPU ausgeführt.
// Haupt-Render-Schleife
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()
Die Methode drawPrimitives führt das Geometrie-Rendering aus. Der Parameter vertexCount gibt die Anzahl der Vertices an. Für jeden Frame wird ein neuer Befehlspuffer erstellt. Present synchronisiert das Rendering mit dem VSync des Displays. Metal verwaltet die Display-Synchronisation automatisch über CAMetalLayer.
MTLRenderPipelineState — ein kompilierter Rendering-Pipeline-Zustand, der Vertex- und Fragment-Shader, Depth-Stencil-Konfiguration, Blending und Ausgabepixelformat umfasst. Das Erstellen eines Pipeline-Zustands ist eine teure Operation, daher werden Objekte zwischengespeichert und wiederverwendet. Für verschiedene Shader-Kombinationen werden unterschiedliche Pipeline-Zustände erstellt.
Metal 3.1 führte schnelles Rendering durch Immutable Samplers ein, die auf der GPU zwischengespeichert werden, um das Texture-Sampling zu beschleunigen. Metal unterstützt bis zu 31 Texturen pro Shader-Slot auf Apple Silicon. Auf älteren Geräten mit A13 und darunter ist das Limit auf 16 Slots reduziert. Es wird empfohlen, Texturen in Texture Atlases zu kombinieren, um die Anzahl der Samples zu reduzieren.
Metal Shading Language (MSL) ist eine Shader-Programmiersprache basierend auf C++14 mit Erweiterungen für GPU-Berechnungen. MSL unterstützt Templates, Funktionsüberladung, Namespaces und Adressarithmetik. Shader werden über Apples LLVM-Backend in binären GPU-Code kompiliert.
Vertex-Shader verarbeitet jeden Vertex: transformiert Koordinaten vom Weltraum in den Bildschirmraum, berechnet Normalen und übergibt Daten an den Fragment-Shader. Fragment-Shader berechnet die Farbe jedes Pixels: wendet Texturen, Beleuchtung und Post-Processing-Effekte an.
// 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;
}
[[attribute(N)]]-Attribute entsprechen Vertex-Formaten, die in MTLVertexDescriptor angegeben sind. Der Buffer [buffer(0)] übergibt die MVP-Matrix als Uniform-Variable. Die Vertex-Position muss mit [[position]] markiert werden, um sie an den Rasterizer zu übergeben. Alle MSL-Vektortypen — float2, float3, float4 — werden auf GPU-Hardwareregister abgebildet.
Compute-Shader (Kernel) ist eine GPU-Funktion, die außerhalb der Grafikpipeline ausgeführt wird. Kernel-Funktionen werden mit dem Kernel-Qualifikator markiert und in Threads ausgeführt, die in Threadgroups organisiert sind. Compute-Shader werden für Bildverarbeitung, Physiksimulation, ML und Post-Processing verwendet.
// Compute-Kernel für Bildunschärfe
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);
}
Der Parameter gid [[thread_position_in_grid]] enthält den eindeutigen Thread-Index. Texture2D<type> wird nach Pixeldtyp spezialisiert: half (FP16), float (FP32). Compute-Kernel können mit einer Gittergröße von über 1 Milliarde Threads auf dem M4 Ultra gestartet werden. Die maximale Threadgroup-Größe beträgt 1024 Threads auf Apple Silicon GPUs.
Metal Performance Shaders (MPS) ist eine Bibliothek optimierter GPU-Funktionen von Apple. MPS umfasst卷积 neuronale Netze (MPSNNConvolution), Matrixmultiplikation (MPSMatrixMultiplication), Sortierung (MPSParallelSort) und Bildverarbeitung (MPSImageGaussianBlur). Alle Funktionen sind für spezifische Apple GPUs optimiert.
MetalFX ist eine Upscaling- und Anti-Aliasing-Technologie, die mit NVIDIA DLSS und AMD FSR konkurriert. MetalFX bietet zwei Modi: Spatial (räumliches Upscaling durch FSR 2-Algorithmus) und Temporal (zeitliches Upscaling mit Bewegungsvektoren). Temporal MetalFX liefert eine Qualität nahe nativen 4K aus einem 1440p-Render.
Laut Apple (2025) bietet MetalFX Temporal auf dem M4 Max bis zu 3x Leistungssteigerung in Spielen bei qualitativ kaum unterscheidbarem Ergebnis von nativer Auflösung. MetalFX funktioniert auf jeder GPU, die Metal 3 unterstützt, ohne dedizierte Tensor-Kerne. Die Integration von MetalFX in ein Projekt erfordert etwa 50 Zeilen Code.
Raytracing in Metal 3 wird auf M3-, M4- und A17 Pro-Chips mit Hardware-Beschleunigungseinheiten (Ray Tracing Accelerators) unterstützt. Metal bietet MTLAccelerationStructure zum Aufbau von BVH und MTLIntersectionFunction für Strahlschnittpunkte in Shadern. Riesige Szenen mit Millionen von Dreiecken werden in Millisekunden in BVH kompiliert.
Laut Apple (2025) führt Hardware-Raytracing auf dem M4 Ultra bis zu 40 Milliarden Strahlschnittpunkte pro Sekunde (Giga rays/s) durch. Das ist 4-mal schneller als Software-Raytracing auf dem M1 Ultra. Metal RT unterstützt Schnittpunktabfragen, dynamische Geometrie und Motion Blur für realistische Animationen. Reflexionen und Schatten mit Raytracing laufen in Echtzeit bei 60 FPS.
Unified Memory ist die Apple-Silicon-Architektur, bei der CPU und GPU denselben physischen Speicher teilen. Metal auf Apple Silicon erfordert kein Kopieren von Daten zwischen CPU und GPU: MTLBuffer im shared-Modus ist ohne Kopieren für beide Prozessoren zugänglich. Dies beseitigt den Hauptengpass traditioneller GPUs (PCIe-Transfers).
Zero-Copy in Metal ermöglicht der CPU, Daten in einen Puffer zu schreiben, und der GPU, sie ohne Verzögerung zu lesen. Laut Apple (2025) bietet dies eine Leistungssteigerung von 30–50% gegenüber diskreten GPUs bei Spielen und ML-Aufgaben. Für diskrete GPUs (Mac Pro mit Radeon) unterstützt Metal den managed-Modus mit automatischer Synchronisation durch Memory Barriers.
Häufig gestellte Fragen
Metal ist Apples Low-Level-GPU-API mit minimaler CPU-Überlastung. Es wird für 3D-Grafik, ML-Berechnungen, Bildverarbeitung und Simulationen auf iOS, macOS und tvOS verwendet. Es ersetzt OpenGL und OpenCL.
Metal funktioniert nur auf Apple-Geräten und ist mit Unified Memory und Metal Performance Shaders integriert. Vulkan ist eine plattformübergreifende API für Windows, Android und Linux. Beide APIs sind leistungsmäßig vergleichbar, aber Metal hat geringeren Overhead auf Apple Silicon.
Ja, mit Metal 3 auf M3-, M4- und A17 Pro-Chips ist Hardware-Raytracing verfügbar. Metal bietet MTLAccelerationStructure und Unterstützung für Schnittpunktabfragen in Shadern. Leistung — bis zu 40 Giga rays/s auf M4 Ultra.
MetalFX ist Apples Upscaling-Technologie mit Spatial- und Temporal-Modi. Es funktioniert auf jeder GPU mit Metal 3, ohne Tensor-Kerne. Bietet bis zu 3x Leistungssteigerung mit Qualität nahe nativen 4K auf M4 Max.
Die Einstiegshürde ist höher als bei SceneKit oder Unity aufgrund der Low-Level-Ressourcenverwaltung. Apple bietet Metal Sample Code und Tutorials auf developer.apple.com. Das grundlegende Rendern eines Dreiecks erfordert etwa 200 Zeilen Code.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch