Metal je nízkoúrovňové grafické a výpočetní API od Apple, které poskytuje přímý přístup k GPU na iOS, macOS a tvOS. Nahrazuje OpenGL a OpenCL, poskytuje minimální režii CPU a předvídatelný výkon. Podle údajů Apple WWDC (2025) je Metal používán v 98% aplikací s GPU renderingem v ekosystému Apple.
Hlavní body
Metal je nízkoúrovňové API pro práci s grafickým procesorem (GPU), představené Apple v roce 2014 spolu s iOS 8 a OS X Yosemite. Metal byl vytvořen jako náhrada za OpenGL a OpenCL s cílem snížit režii CPU a poskytnout přímější přístup k GPU hardwaru na zařízeních Apple.
Na rozdíl od OpenGL, kde ovladač provádí mnoho kontrol a transformací na CPU, Metal používá model explicitního řízení zdrojů. Vývojář kontroluje alokaci paměti, synchronizaci a odesílání příkazů GPU, což poskytuje zvýšení výkonu až o 50% ve srovnání s OpenGL ES na stejném hardwaru.
Metal podporuje všechny čipy Apple, od A7 (2013) až po M4 Ultra (2025). API se neustále vyvíjí: Metal 3 (2022) přidal podporu mesh-shaderů a sledování paprsků, Metal 3.1 (2023) — rychlé sdílení zdrojů mezi CPU a GPU, a Metal 4 (2025) — hardwarovou akceleraci neuronových sítí na GPU s podporou FP8 a INT4.
První verze Metalu (2014) poskytovala základní API pro grafický rendering na iOS. Metal 2 (2017) přidal výpočetní shadery a Metal Performance Shaders. Metal 3 (2022) představil MetalFX Upscaling — vlastní technologii upscalingu pro hry, konkurenta NVIDIA DLSS a AMD FSR. MetalFX poskytuje zvýšení výkonu až 2x na Macu s M2.
Metal 4 (2025) se zaměřil na strojové učení a sledování paprsků. Podle údajů Apple (2025) dosahuje Metal 4 na M4 Ultra až 80 TFLOPS ve výpočetních úlohách při FP16 a podporuje hardwarové dekódování AV1. Metal je nyní také podporován na Apple Vision Pro prostřednictvím compositor služby pro rendering imerzivního obsahu.
Architektura Metalu je postavena kolem konceptu explicitního řízení: vývojář vytváří objekty MTLDevice (zařízení), MTLBuffer (datové buffery), MTLTexture (textury) a MTLCommandQueue (fronta příkazů). Na rozdíl od OpenGL, kde je stav uložen v kontextu, Metal používá objekty stavu (state objects), které jsou kompilovány předem.
MTLDevice představuje fyzické nebo virtuální GPU. Všechny prostředky Metalu jsou vytvářeny přes tento objekt: buffery, textury, knihovny shaderů, pipeliny. V systémech s více GPU (Mac Pro) lze zvolit konkrétní zařízení. Metoda supportsFamily: kontroluje podporu funkcí: sledování paprsků, mesh-shadery, MetalFX.
import Metal
// Získání GPU zařízení
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError("Metal není podporován")
}
// Kontrola možností
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // „Apple M4 Pro”
let maxBufferSize = device.maxBufferLength
Vlastnost maxBufferLength určuje maximální velikost bufferu podporovanou zařízením. Na Apple Silicon s Unified Memory je limit až 128 GB (na M4 Ultra). To umožňuje práci s velkými datovými sadami pro ML a vědecké výpočty bez segmentace bufferů. Zařízení také spravuje paměťový pool prostřednictvím MTLHeap.
MTLBuffer — souvislá oblast paměti přístupná GPU. Buffery se používají pro vrcholová data, matice, uniform proměnné. Režimy: shared (přístup CPU + GPU v jednotné paměti), private (pouze GPU, rychlejší), managed (pro diskrétní GPU se synchronizací). Na Apple Silicon se doporučuje shared pro jednoduchost.
MTLTexture — vícerozměrné pole pixelů pro textury a renderovací cíle. Podporovány jsou 1D, 2D, 3D, cube a array textury. Formáty: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (komprese), hloubkové (depth32Float) a stencil. Texture Usage flagy určují, jak bude textura použita: rendering, čtení shaderem, kopírování.
MTLLibrary — kolekce kompilovaných GPU funkcí (shaderů). Knihovna může být vytvořena ze zdrojového kódu MSL (Metal Shading Language) za běhu nebo předkompilována a zahrnuta do balíčku (.metallib). Doporučuje se předkompilace pro odstranění zpoždění ve fázi inicializace.
MTLFunction představuje konkrétní funkci shaderu. Vertex shadery, fragment shadery, výpočetní (kernel) a mesh-shadery jsou vytvářeny prostřednictvím knihovny. Funkce jsou ukládány do cache na GPU a znovu používány mezi snímky. Argumenty shaderů jsou specifikovány prostřednictvím bufferů a texturových slotů s vazbou podle indexu.
Rendering v Metalu je organizován prostřednictvím asynchronních front příkazů. Vývojář vytvoří MTLCommandBuffer, zakóduje do něj příkazy renderingu nebo výpočtů a odešle do MTLCommandQueue. GPU provádí příkazy sekvenčně, zatímco CPU může pokračovat v práci. Synchronizace probíhá prostřednictvím semaforů nebo completionHandler.
MTLCommandQueue — fronta příkazů vytvořená z MTLDevice. Aplikace může mít několik front pro grafiku, výpočty a kopírování. Každá fronta zaručuje sekvenční provádění příkazů. MTLCommandBuffer — kontejner pro jednu dávku práce GPU. Po zakódování je potvrzen a proveden na GPU.
// Hlavní renderovací cyklus
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 provádí kreslení geometrie. Parametr vertexCount udává počet vrcholů. Pro každý snímek je vytvořen nový command buffer. Present synchronizuje kreslení s VSync obrazovky. Metal automaticky spravuje synchronizaci s displejem prostřednictvím CAMetalLayer.
MTLRenderPipelineState — kompilovaný stav renderovacího pipeline, zahrnující vertex a fragment shadery, konfiguraci depth-stencil, blending a formát výstupních pixelů. Vytvoření pipeline state je nákladná operace, proto jsou objekty ukládány do cache a znovu používány. Pro různé kombinace shaderů jsou vytvářeny různé pipeline states.
Metal 3.1 představil rychlý rendering prostřednictvím Immutable Samplers, které jsou ukládány do cache na GPU pro urychlení vzorkování textur. Metal podporuje až 31 textur na slot shaderu v prostředích Apple Silicon. Na starších zařízeních s A13 a níže je limit snížen na 16 slotů. Doporučuje se spojování textur do Texture Atlases pro snížení počtu vzorků.
Metal Shading Language (MSL) — programovací jazyk shaderů založený na C++14 s rozšířeními pro GPU výpočty. MSL podporuje šablony (templates), přetěžování funkcí, jmenné prostory a adresní aritmetiku. Shadery jsou kompilovány do binárního GPU kódu prostřednictvím Apple LLVM backendu.
Vertex shader zpracovává každý vrchol: transformuje souřadnice z prostoru světa do prostoru obrazovky, počítá normály a předává data fragment shaderu. Fragment shader počítá barvu každého pixelu: aplikuje textury, osvětlení a efekty post-processingu.
// 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;
}
Atributy [[attribute(N)]] odpovídají formátům vrcholů specifikovaným v MTLVertexDescriptor. Buffer [buffer(0)] předává matici MVP jako uniform proměnnou. Pozice vrcholu musí být označena [[position]] pro předání rasterizátoru. Všechny MSL vektorové typy — float2, float3, float4 — jsou mapovány na hardwarové registry GPU.
Compute shader (kernel) — GPU funkce prováděná mimo grafický pipeline. Kernel funkce jsou označeny kvalifikátorem kernel a prováděny ve vláknech (threads) organizovaných do skupin (threadgroups). Výpočetní shadery se používají pro zpracování obrazu, simulaci fyziky, ML a post-processing.
// Compute kernel pro rozostření obrazu
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);
}
Parametr gid [[thread_position_in_grid]] obsahuje jedinečný index vlákna. Texture2D
Metal Performance Shaders (MPS) — knihovna optimalizovaných GPU funkcí od Apple. MPS zahrnuje konvoluční neuronové sítě (MPSNNConvolution), maticové násobení (MPSMatrixMultiplication), třídění (MPSParallelSort) a zpracování obrazu (MPSImageGaussianBlur). Všechny funkce jsou optimalizovány pro konkrétní GPU Apple.
MetalFX — technologie upscalingu a vyhlazování, konkurent NVIDIA DLSS a AMD FSR. MetalFX nabízí dva režimy: Spatial (prostorový upscaling pomocí algoritmu FSR 2) a Temporal (časový upscaling s motion vectors). Temporal MetalFX poskytuje kvalitu blízkou nativnímu 4K z renderingu ve 1440p.
Podle údajů Apple (2025) poskytuje MetalFX Temporal na M4 Max zvýšení výkonu až 3x ve hrách při zachování kvality vizuálně nerozeznatelné od nativního rozlišení. MetalFX funguje na jakémkoli GPU podporujícím Metal 3, bez vyhrazených tensor jader. Integrace MetalFX do projektu vyžaduje přibližně 50 řádků kódu.
Ray Tracing v Metal 3 je podporován na čipech M3, M4 a A17 Pro s hardwarovými akceleračními bloky (Ray Tracing Accelerators). Metal poskytuje MTLAccelerationStructure pro stavbu BVH a MTLIntersectionFunction pro průsečík paprsků v shaderech. Obří scény s miliony trojúhelníků jsou kompilovány do BVH v milisekundách.
Podle údajů Apple (2025) provádí hardwarové sledování paprsků na M4 Ultra až 40 miliard průsečíků paprsků za sekundu (Giga rays/s). To je 4krát rychlejší než softwarové sledování paprsků na M1 Ultra. Metal RT podporuje intersection queries, dynamické geometrie a Motion Blur pro realistické animace. Odrazy a stíny se sledováním paprsků fungují v reálném čase při 60 FPS.
Unified Memory — architektura Apple Silicon, kde CPU a GPU používají stejnou fyzickou paměť. Metal na Apple Silicon nevyžaduje kopírování dat mezi CPU a GPU: MTLBuffer v shared režimu je přístupný oběma procesorům bez kopírování. To odstraňuje hlavní úzké hrdlo tradičních GPU (PCIe přenosy).
Zero-Copy v Metalu umožňuje CPU zapisovat data do bufferu a GPU je číst bez zpoždění. Podle údajů Apple (2025) to poskytuje zvýšení výkonu o 30–50% ve srovnání s diskrétními GPU ve hrách a ML úlohách. Pro diskrétní GPU (Mac Pro s Radeon) Metal podporuje managed režim s automatickou synchronizací prostřednictvím memory barriers.
Často kladené otázky
Metal — nízkoúrovňové Apple API pro práci s GPU, poskytující minimální režii CPU. Je potřeba pro 3D grafiku, ML výpočty, zpracování obrazu a simulace na iOS, macOS a tvOS. Nahrazuje OpenGL a OpenCL.
Metal funguje pouze na zařízeních Apple, je integrován s Unified Memory a Metal Performance Shaders. Vulkan je multiplatformní API pro Windows, Android a Linux. Z hlediska výkonu jsou obě API srovnatelná, ale Metal má nižší režii na Apple Silicon.
Ano, od Metal 3 na čipech M3, M4 a A17 Pro je k dispozici hardwarové sledování paprsků. Metal poskytuje MTLAccelerationStructure a podporu intersection queries v shaderech. Výkon — až 40 Giga rays/s na M4 Ultra.
MetalFX — technologie upscalingu Apple s režimy Spatial a Temporal. Funguje na jakémkoli GPU s Metal 3, bez tensor jader. Poskytuje zvýšení výkonu až 3x s kvalitou blízkou nativnímu 4K na M4 Max.
Práh vstupu je vyšší než u SceneKit nebo Unity kvůli nízkoúrovňovému řízení zdrojů. Apple poskytuje Metal Sample Code a tutoriály na developer.apple.com. Pro základní rendering trojúhelníku je potřeba přibližně 200 řádků kódu.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také