Metal este un API grafic și de calcul de nivel scăzut de la Apple, care oferă acces direct la GPU pe iOS, macOS și tvOS. Înlocuiește OpenGL și OpenCL, oferind costuri generale minime ale CPU și performanță previzibilă. Conform datelor Apple WWDC (2025), Metal este utilizat în 98% dintre aplicațiile cu randare GPU din ecosistemul Apple.
Principalele puncte
Metal este un API de nivel scăzut pentru lucrul cu procesorul grafic (GPU), prezentat de Apple în 2014 împreună cu iOS 8 și OS X Yosemite. Metal a fost creat ca înlocuitor pentru OpenGL și OpenCL cu scopul de a reduce costurile generale ale CPU și de a oferi un acces mai direct la hardware-ul GPU pe dispozitivele Apple.
Spre deosebire de OpenGL, unde driverul efectuează multiple verificări și transformări pe CPU, Metal utilizează modelul de gestionare explicită a resurselor. Dezvoltatorul controlează alocarea memoriei, sincronizarea și trimiterea comenzilor GPU, ceea ce oferă o creștere a performanței de până la 50% față de OpenGL ES pe același hardware.
Metal suportă toate cipurile Apple, începând cu A7 (2013) până la M4 Ultra (2025). API-ul este în continuă dezvoltare: Metal 3 (2022) a adăugat suport pentru mesh-shadere și ray tracing, Metal 3.1 (2023) — partajarea rapidă a resurselor între CPU și GPU, iar Metal 4 (2025) — accelerarea hardware a rețelelor neuronale pe GPU cu suport FP8 și INT4.
Prima versiune a Metal (2014) oferea un API de bază pentru randarea grafică pe iOS. Metal 2 (2017) a adăugat shadere de calcul și Metal Performance Shaders. Metal 3 (2022) a introdus MetalFX Upscaling — propria tehnologie de upscaling pentru jocuri, concurentă cu NVIDIA DLSS și AMD FSR. MetalFX oferă o creștere a performanței de până la 2x pe Mac cu M2.
Metal 4 (2025) s-a concentrat pe învățarea automată și ray tracing. Conform datelor Apple (2025), Metal 4 pe M4 Ultra atinge până la 80 TFLOPS în sarcini de calcul la FP16 și suportă decodarea hardware AV1. Metal este acum suportat și pe Apple Vision Pro prin serviciul compositor pentru randarea conținutului imersiv.
Arhitectura Metal este construită în jurul conceptului de gestionare explicită: dezvoltatorul creează obiecte MTLDevice (dispozitiv), MTLBuffer (buffere de date), MTLTexture (texturi) și MTLCommandQueue (coadă de comenzi). Spre deosebire de OpenGL, unde starea este stocată în context, Metal utilizează obiecte de stare (state objects) care sunt compilate în avans.
MTLDevice reprezintă un GPU fizic sau virtual. Toate resursele Metal sunt create prin acest obiect: buffere, texturi, biblioteci de shadere, pipeline-uri. În sistemele cu mai multe GPU-uri (Mac Pro) se poate alege un dispozitiv specific. Metoda supportsFamily: verifică suportul funcțiilor: ray tracing, mesh-shadere, MetalFX.
import Metal
// Obținerea dispozitivului GPU
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError("Metal nu este suportat")
}
// Verificarea capacităților
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // „Apple M4 Pro”
let maxBufferSize = device.maxBufferLength
Proprietatea maxBufferLength determină dimensiunea maximă a bufferului suportată de dispozitiv. Pe Apple Silicon cu Unified Memory, limita este de până la 128 GB (pe M4 Ultra). Acest lucru permite lucrul cu seturi mari de date pentru ML și calcule științifice fără segmentarea bufferelor. Dispozitivul gestionează, de asemenea, memoria partajata prin MTLHeap.
MTLBuffer — o zonă de memorie continuă accesibilă GPU-ului. Bufferele sunt utilizate pentru datele vertexurilor, matrice, variabile uniform. Moduri: shared (acces CPU + GPU în memoria unificată), private (doar GPU, mai rapid), managed (pentru GPU-uri discrete, cu sincronizare). Pe Apple Silicon se recomandă shared pentru simplitate.
MTLTexture — un tablou multidimensional de pixeli pentru texturi și target-uri de randare. Sunt suportate texturi 1D, 2D, 3D, cube și array. Formate: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (comprimare), de adâncime (depth32Float) și stencil. Flag-urile Texture Usage indică modul de utilizare a texturii: randare, citire shader, copiere.
MTLLibrary — o colecție de funcții GPU compilate (shadere). Biblioteca poate fi creată din codul sursă MSL (Metal Shading Language) în timpul executării sau precompilată și inclusă în pachet (.metallib). Se recomandă compilarea prealabilă pentru a elimina întârzierile din faza de inițializare.
MTLFunction reprezintă o funcție shader specifică. Shaderele de vertex, fragment, de calcul (kernel) și mesh-shaderele sunt create prin bibliotecă. Funcțiile sunt stocate în cache pe GPU și reutilizate între cadre. Argumentele shaderelor sunt specificate prin buffere și sloturi de textură cu legare pe baza indexului.
Randarea în Metal este organizată prin cozi de comenzi asincrone. Dezvoltatorul creează un MTLCommandBuffer, codifică în el comenzi de randare sau calcul și le trimite la MTLCommandQueue. GPU-ul execută comenzile secvențial, iar CPU-ul poate continua lucrul. Sincronizarea se realizează prin semafoare sau completionHandler.
MTLCommandQueue — o coadă de comenzi creată din MTLDevice. Aplicația poate avea mai multe cozi pentru grafică, calcul și copiere. Fiecare coadă garantează executarea secvențială a comenzilor. MTLCommandBuffer — un container pentru o porțiune de lucru GPU. După codificare, acesta este comis și executat pe GPU.
// Bucla principală de randare
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()
Metoda drawPrimitives execută desenarea geometriei. Parametrul vertexCount indică numărul de vertexuri. Pentru fiecare cadru se creează un nou command buffer. Present sincronizează desenarea cu VSync-ul ecranului. Metal gestionează automat sincronizarea cu afișajul prin CAMetalLayer.
MTLRenderPipelineState — starea compilată a pipeline-ului de randare, incluzând shaderele de vertex și fragment, configurația depth-stencil, blending și formatul pixelilor de ieșire. Crearea pipeline state este o operație costisitoare, prin urmare obiectele sunt stocate în cache și reutilizate. Pentru diferite combinații de shadere se creează pipeline states diferite.
Metal 3.1 a introdus randarea rapidă prin Immutable Samplers, care sunt stocate în cache pe GPU pentru accelerarea eșantionării texturilor. Metal suportă până la 31 de texturi pe slot de shader în mediile Apple Silicon. Pe dispozitivele mai vechi cu A13 și mai jos, limita este redusă la 16 sloturi. Se recomandă combinarea texturilor în Texture Atlases pentru a reduce numărul de eșantioane.
Metal Shading Language (MSL) — un limbaj de programare a shaderelor bazat pe C++14 cu extensii pentru calcule GPU. MSL suportă șabloane (templates), supraîncărcarea funcțiilor, spații de nume și aritmetică de adrese. Shaderele sunt compilate în cod binar GPU prin backend-ul LLVM Apple.
Vertex shader procesează fiecare vertex: transformă coordonatele din spațiul mondial în spațiul ecranului, calculează normalele și transmite datele shaderului de fragment. Fragment shader calculează culoarea fiecărui pixel: aplică texturi, iluminare și efecte de post-procesare.
// Shaderul de vertex 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;
}
Atributele [[attribute(N)]] corespund formatelor de vertex specificate în MTLVertexDescriptor. Bufferul [buffer(0)] transmite matricea MVP ca variabilă uniform. Poziția vertexului trebuie marcată cu [[position]] pentru transmiterea la rasterizator. Toate tipurile vectoriale MSL — float2, float3, float4 — sunt mapate pe registrele hardware GPU.
Compute shader (kernel) — o funcție GPU executată în afara pipeline-ului grafic. Funcțiile kernel sunt marcate cu qualificatorul kernel și sunt executate în fire (threads) organizate în grupuri (threadgroups). Shaderele de calcul sunt utilizate pentru procesarea imaginilor, simularea fizicii, ML și post-procesare.
// Compute kernel pentru estomparea imaginii
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);
}
Parametrul gid [[thread_position_in_grid]] conține indexul unic al firului. Texture2D
Metal Performance Shaders (MPS) — o bibliotecă de funcții GPU optimizate furnizată de Apple. MPS include rețele neuronale convoluționale (MPSNNConvolution), înmulțiri de matrice (MPSMatrixMultiplication), sortare (MPSParallelSort) și procesare a imaginilor (MPSImageGaussianBlur). Toate funcțiile sunt optimizate pentru GPU-uri specifice Apple.
MetalFX — tehnologie de upscaling și anti-aliasing, concurentă cu NVIDIA DLSS și AMD FSR. MetalFX oferă două moduri: Spatial (upscaling spațial prin algoritmul FSR 2) și Temporal (upscaling temporal cu vectori de mișcare). Temporal MetalFX oferă o calitate apropiată de 4K nativ din randarea la 1440p.
Conform datelor Apple (2025), MetalFX Temporal pe M4 Max oferă o creștere a performanței de până la 3x în jocuri, păstrând o calitate vizual identică cu rezoluția nativă. MetalFX funcționează pe orice GPU cu Metal 3, fără nuclee tensorice dedicate. Integrarea MetalFX într-un proiect necesită aproximativ 50 de linii de cod.
Ray Tracing în Metal 3 este suportat pe cipurile M3, M4 și A17 Pro cu blocuri hardware de accelerare (Ray Tracing Accelerators). Metal oferă MTLAccelerationStructure pentru construirea BVH și MTLIntersectionFunction pentru intersecția razelor în shadere. Scenele gigantice cu milioane de triunghiuri sunt compilate în BVH în milisecunde.
Conform datelor Apple (2025), ray tracing-ul hardware pe M4 Ultra execută până la 40 de miliarde de intersecții de raze pe secundă (Giga rays/s). Aceasta este de 4 ori mai rapid decât ray tracing-ul software pe M1 Ultra. Metal RT suportă intersection queries, geometrii dinamice și Motion Blur pentru animații realiste. Reflexiile și umbrele cu ray tracing funcționează în timp real la 60 FPS.
Unified Memory — arhitectura Apple Silicon în care CPU și GPU utilizează aceeași memorie fizică. Metal pe Apple Silicon nu necesită copierea datelor între CPU și GPU: MTLBuffer în modul shared este accesibil ambelor procesoare fără copiere. Aceasta elimină principalul blocaj al GPU-urilor tradiționale (transferurile PCIe).
Zero-Copy în Metal permite CPU-ului să scrie date în buffer, iar GPU-ului să le citească fără întârzieri. Conform datelor Apple (2025), aceasta oferă o creștere a performanței de 30–50% față de GPU-urile discrete în jocuri și sarcini ML. Pentru GPU-urile discrete (Mac Pro cu Radeon), Metal suportă modul managed cu sincronizare automată prin memory barriers.
Întrebări frecvente
Metal — un API de nivel scăzut Apple pentru lucrul cu GPU, care oferă costuri generale minime ale CPU. Este necesar pentru grafică 3D, calcule ML, procesarea imaginilor și simulări pe iOS, macOS și tvOS. Înlocuiește OpenGL și OpenCL.
Metal funcționează doar pe dispozitive Apple, este integrat cu Unified Memory și Metal Performance Shaders. Vulkan este un API cross-platform pentru Windows, Android și Linux. În ceea ce privește performanța, ambele API-uri sunt comparabile, dar Metal are un overhead mai mic pe Apple Silicon.
Da, de la Metal 3 pe cipurile M3, M4 și A17 Pro este disponibil ray tracing-ul hardware. Metal oferă MTLAccelerationStructure și suport pentru intersection queries în shadere. Performanță — până la 40 Giga rays/s pe M4 Ultra.
MetalFX — tehnologia de upscaling Apple cu modurile Spatial și Temporal. Funcționează pe orice GPU cu Metal 3, fără nuclee tensorice. Oferă o creștere a performanței de până la 3x cu o calitate apropiată de 4K nativ pe M4 Max.
Pragul de intrare este mai ridicat decât în cazul SceneKit sau Unity din cauza gestionării resurselor de nivel scăzut. Apple oferă Metal Sample Code și tutoriale pe developer.apple.com. Pentru randarea de bază a unui triunghi sunt necesare aproximativ 200 de linii de cod.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și