Metal — ce este, API grafic și shadere

Autor: IT Sectr Publicat: 2026-05-03 Timp de citire: 10 min

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 — API GPU de nivel scăzut Apple cu suport pentru grafică și calcul
  • MTLDevice — abstractizarea GPU prin care sunt create toate resursele Metal
  • Bufferele de comenzi MTLCommandBuffer asigură scrierea multi-thread a comenzilor
  • Shaderele Metal Shading Language sunt compilate în cod GPU pe baza C++14
  • Metal Performance Shaders oferă funcții GPU optimizate pentru ML și filtrare

Ce este Metal?

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.

Istoria Metal

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: dispozitiv și resurse

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 — punctul de intrare al API-ului

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.

swift
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 și MTLTexture — date pentru GPU

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 și compilarea shaderelor

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 prin Metal: buffere de comenzi

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 și MTLCommandBuffer

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.

swift
// 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.

Starea pipeline-ului de randare

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 și shadere

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.

Shadere de vertex și fragment

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.

cpp
// 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.

Shadere de calcul (Compute Kernels)

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.

cpp
// 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 se specializează în funcție de tipul pixelului: half (FP16), float (FP32). Compute kernels pot fi lansate cu o dimensiune a grilei de peste 1 miliard de fire pe M4 Ultra. Dimensiunea maximă a threadgroup-ului — 1024 de fire pe GPU Apple Silicon.

Performanță și Metal Performance Shaders

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 Upscaling

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

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 și Zero-Copy

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

Ce este Metal și la ce servește?

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.

Cu ce se deosebește Metal de Vulkan?

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.

Suportă Metal ray tracing?

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.

Ce este MetalFX Upscaling?

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.

Este dificil să începi să lucrezi cu Metal?

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

  • Metal — API GPU de nivel scăzut Apple cu costuri generale minime ale CPU
  • MTLDevice și MTLCommandQueue — baza arhitecturii cu gestionare explicită a resurselor
  • MTLCommandBuffer și codificatoarele asigură scrierea multi-thread a comenzilor GPU
  • Metal Shading Language (C++14) suportă shadere vertex, fragment, compute și mesh
  • MetalFX — upscaling cu o creștere de până la 3x pe orice GPU cu Metal 3
  • Ray tracing hardware disponibil pe M3/M4/A17 Pro
  • Unified Memory pe Apple Silicon elimină copierea datelor între CPU și GPU

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.

Discutați proiectul

Citiți și