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 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 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 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 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.
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 — 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 — 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-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 — 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.
// 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.
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 (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 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.
// 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.
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.
// 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
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 — 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.
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 — 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
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.
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.
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.
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.
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ó
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.
Olvassa el is