Metal — mi ez, grafikus API és shaderek

Szerző: IT Sectr Megjelenés: 2026-05-03 Olvasási idő: 10 perc

A Metal egy alacsony szintű grafikus és számítási API az Apple-től, amely közvetlen hozzáférést biztosít a GPU-hoz iOS, macOS és tvOS rendszereken. Felváltja az OpenGL-t és OpenCL-t, minimális CPU-terhelést és kiszámítható teljesítményt nyújtva. Az Apple WWDC (2025) adatai szerint a Metal-t használja az alkalmazások 98%-a GPU-rendereléssel az Apple ökoszisztémájában.

Főbb pontok

  • Metal — alacsony szintű Apple GPU API grafika és számítás támogatással
  • MTLDevice — GPU absztrakció, amelyen keresztül az összes Metal erőforrás létrejőn
  • Parancs pufferek MTLCommandBuffer többszálú parancsírást biztosítanak
  • Metal Shading Language shaderek C++14 alapján GPU kóddá fordulnak
  • Metal Performance Shaders optimalizált GPU funkciókat nyújtanak ML-hez és szűréshez

Mi az a Metal?

Metal egy alacsony szintű API a grafikus processzorral (GPU) való munkához, amelyet az Apple 2014-ben mutatott be az iOS 8 és OS X Yosemite társaságában. A Metal az OpenGL és OpenCL helyettesítésére jött létre azzal a céllal, hogy csökkentse a CPU terhelését és közvetlenebb hozzáférést biztosítson a GPU hardverhez Apple eszközökön.

Ellentétben az OpenGL-lel, ahol az illesztóprogram számos ellenőrzést és transzformációt végez a CPU-n, a Metal a kifejezett erőforráskezelés modelljét használja. A fejlesztő szabályozza a memóriafoglalást, szinkronizációt és a GPU parancsok küldését, ami akár 50%-os teljesítménynövekedést eredményez az OpenGL ES-hez képest ugyanazon a hardveren.

A Metal az összes Apple chipet támogatja, az A7-től (2013) az M4 Ultra-ig (2025). Az API folyamatosan fejlődik: a Metal 3 (2022) mesh-shader és sugárkövetés támogatást adott, a Metal 3.1 (2023) — gyors erőforrásmegosztást CPU és GPU között, a Metal 4 (2025) pedig neurális hálózatok hardveres gyorsítását a GPU-n FP8 és INT4 támogatással.

A Metal története

A Metal első változata (2014) alap API-t biztosított grafikus rendereléshez iOS-en. A Metal 2 (2017) számító shadereket és Metal Performance Shaders-t adott hozzá. A Metal 3 (2022) bevezette a MetalFX Upscaling-et — az Apple saját felskálázási technológiáját játékokhoz, az NVIDIA DLSS és AMD FSR versenytársát. A MetalFX akár 2x teljesítménynövekedést biztosít Mac-en M2-vel.

A Metal 4 (2025) a gépi tanulásra és sugárkövetésre összpontosított. Az Apple (2025) adatai szerint a Metal 4 az M4 Ultra-n akár 80 TFLOPS-ot is elér számító feladatokban FP16 mellett, és támogatja az AV1 hardveres dekódolását. A Metal most már az Apple Vision Pro-n is támogatott a kompozitor szolgáltatáson keresztül immerzív tartalom rendereléséhez.

A Metal architektúrája: eszköz és erőforrások

A Metal architektúrája a kifejezett kezelés koncepciója köré épül: a fejlesztő MTLDevice (eszköz), MTLBuffer (adat puffer), MTLTexture (textúra) és MTLCommandQueue (parancs sor) objektumokat hoz létre. Ellentétben az OpenGL-lel, ahol az állapot a kontextusban tárolódik, a Metal állapot objektumokat (state objects) használ, amelyeket előre lefordít.

MTLDevice — az API belépési pontja

MTLDevice egy fizikai vagy virtuális GPU-t képvisel. Az összes Metal erőforrás ezen az objektumon keresztül jön létre: pufferek, textúrák, shader könyvtárak, pipeline-ok. Több GPU-s rendszerekben (Mac Pro) kiválasztható egy adott eszköz. A supportsFamily: metódus ellenőrzi a funkciók támogatását: sugárkövetés, mesh-shaderek, MetalFX.

swift
import Metal
 
// GPU eszköz lekérése
guard let device = MTLCreateSystemDefaultDevice() else {
    fatalError("Metal nem támogatott")
}
 
// Képességek ellenőrzése
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // „Apple M4 Pro”
let maxBufferSize = device.maxBufferLength

A maxBufferLength tulajdonság határozza meg a maximális puffer méretet, amelyet az eszköz támogat. Apple Silicon-on Unified Memory-val a korlát akár 128 GB is lehet (M4 Ultra-n). Ez lehetővé teszi a nagy adathalmazokkal való munkát ML és tudományos számításokhoz pufferek szegmentálása nélkül. Az eszköz a memória medencét is kezeli a MTLHeap-en keresztül.

MTLBuffer és MTLTexture — adatok a GPU számára

MTLBuffer — egy folytonos memóriaterület, amely a GPU számára elérhető. A puffereket csúcs adatokhoz, mátrixokhoz, uniform változókhoz használják. Módok: shared (CPU + GPU hozzáférés egységes memóriában), private (csak GPU, gyorsabb), managed (diszkrét GPU-khoz, szinkronizációval). Apple Silicon-on a shared ajánlott az egyszerűség érdekében.

MTLTexture — többdimenziós pixel tömb textúrákhoz és render célokhoz. 1D, 2D, 3D, cube és array textúrák támogatottak. Formátumok: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (tömörítés), mélység (depth32Float) és stencil. A Texture Usage jelzők azt mutatják, hogy a textúrát hogyan használják: renderelés, shader olvasás, másolás.

MTLLibrary és shader fordítás

MTLLibrary — lefordított GPU funkciók (shaderek) gyűjteménye. A könyvtár létrehozható MSL (Metal Shading Language) forráskódból futási időben vagy előre lefordítva és a csomagba (.metallib) foglalva. Az előzetes fordítás ajánlott az inicializálási fázis késleltetéseinek kiküszöbölésére.

MTLFunction egy adott shader függvényt képvisel. A vertex shaderek, fragment shaderek, számító (kernel) és mesh-shaderek a könyvtáron keresztül jönnek létre. A függvények cache-elődnek a GPU-n és újra felhasználódnak a képfrekvenciák között. A shader argumentumokat puffereken és textúra helyeken keresztül adják meg, index alapú kötéssel.

Renderelés Metal segítségével: parancs pufferek

Renderelés Metal-ban aszinkron parancs sorokon keresztül szerveződik. A fejlesztő létrehoz egy MTLCommandBuffer-t, renderelési vagy számítási parancsokat kódol bele, és elküldi az MTLCommandQueue-ba. A GPU szekvenciálisan hajtja végre a parancsokat, míg a CPU folytathatja a munkáját. A szinkronizáció szemaforokon vagy completionHandler-en keresztül történik.

MTLCommandQueue és MTLCommandBuffer

MTLCommandQueue — parancs sor, amely MTLDevice-ból jön létre. Az alkalmazásnak több sora is lehet grafika, számítás és másolás számára. Minden sor garantálja a parancsok szekvenciális végrehajtását. MTLCommandBuffer — tároló egy adag GPU munka számára. A kódolás után elküldésre és végrehajtásra kerül a GPU-n.

swift
// Fő renderelési ciklus
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()

A drawPrimitives metódus a geometria rajzolását végzi. A vertexCount paraméter a csúcspontok számát jelzi. Minden képfrekvenciához új command buffer jön létre. Present szinkronizálja a rajzolást a képernyő VSync-jével. A Metal automatikusan kezeli a kijelzővel való szinkronizációt a CAMetalLayer-en keresztül.

Render Pipeline Állapot

MTLRenderPipelineState — a render pipeline lefordított állapota, amely tartalmazza a vertex és fragment shadereket, a depth-stencil konfigurációt, a blendinget és a kimeneti pixel formátumot. A pipeline state létrehozása költséges művelet, ezért az objektumok cache-elődnek és újra felhasználódnak. Különböző shader kombinációkhoz különböző pipeline states jönnek létre.

A Metal 3.1 bevezette a gyors renderelést Immutable Samplers-en keresztül, amelyek a GPU-n cache-elődnek a textúra mintavételezés gyorsítására. A Metal akár 31 textúrát is támogat shader helyenként Apple Silicon környezetekben. Az A13-as és régebbi eszközökön a korlát 16 helyre csökken. Javasolt a textúrák egyesítése Texture Atlases-ben a minták számának csökkentésére.

Metal Shading Language és shaderek

Metal Shading Language (MSL) — shader programozási nyelv C++14 alapokon, GPU számításokhoz való kiterjesztésekkel. Az MSL támogatja a sablonokat (templates), függvény túlterhelést, névtereket és címaritmetikát. A shaderek az Apple LLVM backend-en keresztül bináris GPU kóddá fordulnak.

Vertex és Fragment Shaderek

Vertex shader feldolgoz minden csúcspontot: átalakítja a koordinátákat a világtérből képernyőtérbe, kiszámítja a normálokat és továbbítja az adatokat a fragment shader-nek. Fragment shader kiszámítja minden pixel színét: textúrákat, világítást és utófeldolgozási effekteket alkalmaz.

cpp
// 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;
}

Az [[attribute(N)]] attribútumok megfelelnek az MTLVertexDescriptor-ban megadott csúcspont formátumoknak. A [buffer(0)] puffer az MVP mátrixot adja át uniform változóként. A csúcspont pozícióját [[position]]-nel kell megjelölni a raszterizálóhoz való továbbításhoz. Az összes MSL vektor típus — float2, float3, float4 — GPU hardver regiszterekre képeződik le.

Számító Shaderek (Compute Kernels)

Compute shader (kernel) — egy GPU függvény, amely a grafikus pipeline-on kívül fut. A kernel függvényeket a kernel minősítővel jelölik és szálakban (threads) hajtódnak végre, amelyek csoportokba (threadgroups) szerveződnek. A számító shadereket képfeldolgozáshoz, fizikai szimulációhoz, ML-hez és utófeldolgozáshoz használják.

cpp
// Compute kernel kép elmosásához
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);
}

A gid [[thread_position_in_grid]] paraméter egyedi szál indexet tartalmaz. A Texture2D a pixel típusa szerint specializálódik: half (FP16), float (FP32). A compute kernelek akár 1 milliárdnál több szálas rács mérettel is elindíthatók M4 Ultra-n. A maximális threadgroup méret 1024 szál Apple Silicon GPU-n.

Teljesítmény és Metal Performance Shaders

Metal Performance Shaders (MPS) — optimalizált GPU függvények könyvtára az Apple-től. Az MPS tartalmaz konvolúciós neurális hálózatokat (MPSNNConvolution), mátrix szorzást (MPSMatrixMultiplication), rendezést (MPSParallelSort) és képfeldolgozást (MPSImageGaussianBlur). Az összes függvény az adott Apple GPU-kra van optimalizálva.

MetalFX Upscaling

MetalFX — felskálázási és élsimítási technológia, az NVIDIA DLSS és AMD FSR versenytársa. A MetalFX két módot kínál: Spatial (térbeli felskálázás FSR 2 algoritmussal) és Temporal (időbeli felskálázás mozgásvektorokkal). A Temporal MetalFX a natív 4K-hoz közeli minőséget biztosít 1440p-s renderelésből.

Az Apple (2025) adatai szerint a MetalFX Temporal az M4 Max-on akár 3x teljesítménynövekedést biztosít játékokban, miközben vizuálisan megkülönböztethetetlen minőséget tart fenn a natív felbontástól. A MetalFX bármely Metal 3-at támogató GPU-n működik dedikált tenzor magok nélkül. A MetalFX integrálása egy projektbe kb. 50 sor kódot igényel.

Sugárkövetés Metal-ban

Ray Tracing a Metal 3-ban M3, M4 és A17 Pro chipeken támogatott hardveres gyorsító blokkokkal (Ray Tracing Accelerators). A Metal MTLAccelerationStructure-t biztosít BVH építéséhez és MTLIntersectionFunction-t sugár metszéshez shaderekben. A millió háromszöggel rendelkezœ óriási jelenetek milliszekundumok alatt fordulnak BVH-vé.

Az Apple (2025) adatai szerint a hardveres sugárkövetés az M4 Ultra-n akár 40 milliárd sugár metszést is végez másodpercenként (Giga rays/s). Ez négszer gyorsabb, mint a szoftveres sugárkövetés az M1 Ultra-n. A Metal RT támogatja az intersection queries-t, dinamikus geometriákat és Motion Blur-t a valósághű animációkért. A reflexiók és árnyékok sugárkövetéssel valós idejűben, 60 FPS mellett működnek.

Unified Memory és Zero-Copy

Unified Memory — az Apple Silicon architektúrája, ahol a CPU és GPU ugyanazt a fizikai memóriát használja. A Metal Apple Silicon-on nem igényel adatmásolást CPU és GPU között: az MTLBuffer shared módban másolás nélkül elérhető mindkét processzor számára. Ez megszünteti a hagyományos GPU-k fő szűk keresztmetszetét (PCIe átvitel).

A Zero-Copy Metal-ban lehetővé teszi, hogy a CPU adatokat írjon a pufferbe, és a GPU késleltetés nélkül olvassa azokat. Az Apple (2025) adatai szerint ez 30–50%-os teljesítménynövekedést eredményez a diszkrét GPU-khoz képest játékokban és ML feladatokban. Diszkrét GPU-khoz (Mac Pro Radeonnal) a Metal a managed módot támogatja automatikus szinkronizációval memory barriers-en keresztül.

Gyakran Ismételt Kérdések

Mi az a Metal és mire használják?

Metal — az Apple alacsony szintű API-ja GPU-val való munkához, minimális CPU terheléssel. 3D grafikához, ML számításokhoz, képfeldolgozáshoz és szimulációkhoz iOS, macOS és tvOS rendszereken. Felváltja az OpenGL-t és OpenCL-t.

Miben különbözik a Metal a Vulkantól?

Metal csak Apple eszközökön működik, integrálva van a Unified Memory-val és Metal Performance Shaders-szel. A Vulkan egy többplatformos API Windows, Android és Linux rendszerekhez. Teljesítmény szempontjából mindkét API összehasonlítható, de a Metal alacsonyabb terheléssel rendelkezik Apple Silicon-on.

Támogatja a Metal a sugárkövetést?

Igen, a Metal 3-tól kezdve M3, M4 és A17 Pro chipeken elérhető a hardveres sugárkövetés. A Metal MTLAccelerationStructure-t és intersection queries támogatást nyújt shaderekben. Teljesítmény — akár 40 Giga rays/s M4 Ultra-n.

Mi az a MetalFX Upscaling?

MetalFX — az Apple felskálázási technológiája Spatial és Temporal móddal. Tenzor magok nélkül működik bármely Metal 3-at támogató GPU-n. Akár 3x teljesítménynövekedést biztosít natív 4K-hoz közeli minőséggel M4 Max-on.

Nehéz elkezdeni a Metal használatát?

A belépési küszöb magasabb, mint a SceneKit vagy Unity esetén az alacsony szintű erőforráskezelés miatt. Az Apple Metal Sample Code-ot és oktatóanyagokat biztosít a developer.apple.com oldalon. Egy alapháromszög rendereléséhez kb. 200 sor kód szükséges.

Összefoglaló

  • Metal — alacsony szintű Apple GPU API minimális CPU terheléssel
  • MTLDevice és MTLCommandQueue — az architektúra alapja kifejezett erőforráskezeléssel
  • MTLCommandBuffer és kódolók többszálú GPU parancsírást biztosítanak
  • Metal Shading Language (C++14) támogatja a vertex, fragment, compute és mesh shadereket
  • MetalFX — felskálázás akár 3x növekedéssel bármely Metal 3-as GPU-n
  • Hardveres sugárkövetés elérhető M3/M4/A17 Pro-n
  • Unified Memory Apple Silicon-on megszünteti az adatmásolást CPU és GPU között

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is