Metal — co to jest, API graficzne i shadery

Autor: IT Sectr Opublikowano: 2026-05-03 Czas czytania: 10 min

Metal — niskopoziomowe API graficzne i obliczeniowe od Apple, zapewniające bezpośredni dostęp do GPU na iOS, macOS i tvOS. Zastępuje OpenGL i OpenCL, oferując minimalne narzuty CPU i przewidywalną wydajność. Według danych Apple WWDC (2025), Metal jest używany w 98% aplikacji z renderowaniem GPU w ekosystemie Apple.

Najważniejsze

  • Metal — niskopoziomowe API GPU Apple z obsługą grafiki i obliczeń
  • MTLDevice — abstrakcja GPU, przez którą tworzone są wszystkie zasoby Metalu
  • Bufory poleceń MTLCommandBuffer zapewniają wielowątkową rejestrację poleceń
  • Shadery Metal Shading Language są kompilowane do kodu GPU w oparciu o C++14
  • Metal Performance Shaders oferują zoptymalizowane funkcje GPU dla ML i filtracji

Czym jest Metal?

Metal — to niskopoziomowe API do pracy z procesorem graficznym (GPU), przedstawione przez Apple w 2014 roku razem z iOS 8 i OS X Yosemite. Metal został stworzony jako zamiennik OpenGL i OpenCL w celu zmniejszenia narzutów CPU i zapewnienia bardziej bezpośredniego dostępu do sprzętu GPU na urządzeniach Apple.

W przeciwieństwie do OpenGL, gdzie sterownik wykonuje wiele kontroli i transformacji na CPU, Metal używa modelu jawnego zarządzania zasobami. Deweloper kontroluje alokację pamięci, synchronizację i wysyłanie poleceń GPU, co daje wzrost wydajności do 50% w porównaniu z OpenGL ES na tym samym sprzęcie.

Metal obsługuje wszystkie chipy Apple, począwszy od A7 (2013) aż do M4 Ultra (2025). API stale się rozwija: Metal 3 (2022) dodał obsługę mesh-shaderów i śledzenia promieni, Metal 3.1 (2023) — szybkie współdzielenie zasobów między CPU a GPU, a Metal 4 (2025) — sprzętowe przyspieszenie sieci neuronowych na GPU z obsługą FP8 i INT4.

Historia Metalu

Pierwsza wersja Metalu (2014) oferowała podstawowe API do renderowania grafiki na iOS. Metal 2 (2017) dodał shadery obliczeniowe i Metal Performance Shaders. Metal 3 (2022) przedstawił MetalFX Upscaling — własny upscaling dla gier, konkurencyjny wobec NVIDIA DLSS i AMD FSR. MetalFX zapewnia wzrost wydajności do 2x na Mac z M2.

Metal 4 (2025) skoncentrował się na uczeniu maszynowym i śledzeniu promieni. Według danych Apple (2025), Metal 4 na M4 Ultra osiąga do 80 TFLOPS w zadaniach obliczeniowych przy FP16 i obsługuje sprzętowe dekodowanie AV1. Metal jest teraz również obsługiwany na Apple Vision Pro przez compositor-service do renderowania treści immersyjnych.

Architektura Metalu: urządzenie i zasoby

Architektura Metalu jest zbudowana wokół koncepcji jawnego zarządzania: deweloper tworzy obiekty MTLDevice (urządzenie), MTLBuffer (bufory danych), MTLTexture (tekstury) i MTLCommandQueue (kolejka poleceń). W przeciwieństwie do OpenGL, gdzie stan jest przechowywany w kontekście, Metal używa obiektów stanu (state objects), które są kompilowane z wyprzedzeniem.

MTLDevice — punkt wejścia API

MTLDevice reprezentuje fizyczny lub wirtualny GPU. Wszystkie zasoby Metalu są tworzone przez ten obiekt: bufory, tekstury, biblioteki shaderów, potoki. W systemach z wieloma GPU (Mac Pro) można wybrać konkretne urządzenie. Metoda supportsFamily: sprawdza obsługę funkcji: śledzenie promieni, mesh-shadery, MetalFX.

swift
import Metal
 
// Pobieranie urządzenia GPU
guard let device = MTLCreateSystemDefaultDevice() else {
    fatalError("Metal nie jest obsługiwany")
}
 
// Sprawdzanie możliwości
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // „Apple M4 Pro”
let maxBufferSize = device.maxBufferLength

Właściwość maxBufferLength określa maksymalny rozmiar bufora obsługiwanego przez urządzenie. Na Apple Silicon z Unified Memory limit wynosi do 128 GB (na M4 Ultra). Umożliwia to pracę z dużymi zbiorami danych dla ML i obliczeń naukowych bez segmentacji buforów. Urządzenie zarządza również pulą pamięci przez MTLHeap.

MTLBuffer i MTLTexture — dane dla GPU

MTLBuffer — ciągły obszar pamięci dostępny dla GPU. Bufory są używane do danych wierzchołków, macierzy, zmiennych uniform. Tryby: shared (dostęp CPU + GPU w pamięci zunifikowanej), private (tylko GPU, szybszy), managed (dla dyskretnych GPU, z synchronizacją). Na Apple Silicon zalecany jest shared dla prostoty.

MTLTexture — wielowymiarowa tablica pikseli dla tekstur i render targets. Obsługiwane są tekstury 1D, 2D, 3D, cube i array. Formaty: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (kompresja), głębokościowe (depth32Float) i stencil. Flagi Texture Usage określają, jak tekstura będzie używana: renderowanie, odczyt shaderów, kopiowanie.

MTLLibrary i kompilacja shaderów

MTLLibrary — kolekcja skompilowanych funkcji GPU (shaderów). Biblioteka może być utworzona z kodu źródłowego MSL (Metal Shading Language) w czasie wykonywania lub wstępnie skompilowana i dołączona do pakietu (.metallib). Zalecana jest wstępna kompilacja w celu wyeliminowania opóźnień na etapie inicjalizacji.

MTLFunction reprezentuje konkretną funkcję shadera. Shadery wierzchołków (vertex), fragmentów (fragment), obliczeniowe (kernel) i mesh-shadery są tworzone przez bibliotekę. Funkcje są buforowane na GPU i ponownie używane między klatkami. Argumenty shaderów są określane przez bufory i gniazda tekstur z wiązaniem według indeksu.

Renderowanie przez Metal: bufory poleceń

Renderowanie w Metalu jest zorganizowane przez asynchroniczne kolejki poleceń. Deweloper tworzy MTLCommandBuffer, koduje w nim polecenia renderowania lub obliczeń i wysyła do MTLCommandQueue. GPU wykonuje polecenia sekwencyjnie, a CPU może kontynuować pracę. Synchronizacja odbywa się przez semafory lub completionHandler.

MTLCommandQueue i MTLCommandBuffer

MTLCommandQueue — kolejka poleceń tworzona z MTLDevice. Aplikacja może mieć wiele kolejek dla grafiki, obliczeń i kopiowania. Każda kolejka gwarantuje sekwencyjne wykonanie poleceń. MTLCommandBuffer — kontener na jedną porcję pracy GPU. Po zakodowaniu jest zatwierdzany i wykonywany na GPU.

swift
// Główna pętla renderowania
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 wykonuje rysowanie geometrii. Parametr vertexCount określa liczbę wierzchołków. Dla każdej klatki tworzony jest nowy command buffer. Present synchronizuje rysowanie z VSync ekranu. Metal automatycznie zarządza synchronizacją z wyświetlaczem przez CAMetalLayer.

Stan potoku renderowania

MTLRenderPipelineState — skompilowany stan potoku renderowania, obejmujący shader wierzchołków i fragmentów, konfigurację depth-stencil, blending i format pikseli wyjściowych. Tworzenie pipeline state to kosztowna operacja, dlatego obiekty są buforowane i ponownie używane. Dla różnych kombinacji shaderów tworzone są różne pipeline states.

Metal 3.1 wprowadził szybkie renderowanie przez Immutable Samplers, które są buforowane na GPU w celu przyspieszenia próbkowania tekstur. Metal obsługuje do 31 tekstur na gniazdo shadera w środowiskach Apple Silicon. Na starszych urządzeniach z A13 i niższym limit jest obniżony do 16 gniazd. Zaleca się łączenie tekstur w Texture Atlases w celu zmniejszenia liczby próbek.

Metal Shading Language i shadery

Metal Shading Language (MSL) — język programowania shaderów oparty na C++14 z rozszerzeniami do obliczeń GPU. MSL obsługuje szablony (templates), przeciążanie funkcji, przestrzenie nazw i arytmetykę adresową. Shadery są kompilowane do binarnego kodu GPU przez zaplecze LLVM Apple.

Shadery wierzchołków i fragmentów

Vertex shader przetwarza każdy wierzchołek: przekształca współrzędne z przestrzeni świata na przestrzeń ekranu, oblicza normalne i przekazuje dane do shadera fragmentów. Fragment shader oblicza kolor każdego piksela: stosuje tekstury, oświetlenie i efekty post-processingu.

cpp
// Shader wierzchołków Metalu
#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;
}

Atrybuty [[attribute(N)]] odpowiadają formatom wierzchołków określonym w MTLVertexDescriptor. Bufor [buffer(0)] przekazuje macierz MVP jako zmienną uniform. Pozycja wierzchołka musi być oznaczona [[position]] do przekazania do rasteryzatora. Wszystkie typy wektorów MSL — float2, float3, float4 — są mapowane na sprzętowe rejestry GPU.

Shadery obliczeniowe (Compute Kernels)

Compute shader (kernel) — to funkcja GPU wykonywana poza potokiem graficznym. Funkcje kernel są oznaczane kwalifikatorem kernel i wykonywane w wątkach (threads), zorganizowanych w grupy (threadgroups). Shadery obliczeniowe są używane do przetwarzania obrazów, symulacji fizyki, ML i post-processingu.

cpp
// Compute kernel do rozmycia 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]] zawiera unikalny indeks wątku. Texture2D specjalizuje się według typu piksela: half (FP16), float (FP32). Compute kernels mogą być uruchamiane z rozmiarem gridu ponad 1 miliard wątków na M4 Ultra. Maksymalny rozmiar threadgroup — 1024 wątki na GPU Apple Silicon.

Wydajność i Metal Performance Shaders

Metal Performance Shaders (MPS) — biblioteka zoptymalizowanych funkcji GPU dostarczana przez Apple. MPS obejmuje konwolucyjne sieci neuronowe (MPSNNConvolution), mnożenie macierzy (MPSMatrixMultiplication), sortowanie (MPSParallelSort) i przetwarzanie obrazów (MPSImageGaussianBlur). Wszystkie funkcje są zoptymalizowane pod konkretne GPU Apple.

MetalFX Upscaling

MetalFX — technologia upscalingu i wygładzania, konkurencyjna wobec NVIDIA DLSS i AMD FSR. MetalFX oferuje dwa tryby: Spatial (przestrzenny upscaling przez algorytm FSR 2) i Temporal (czasowy upscaling z motion vectors). Temporal MetalFX zapewnia jakość zbliżoną do natywnego 4K z renderowania w 1440p.

Według danych Apple (2025), MetalFX Temporal na M4 Max zapewnia wzrost wydajności do 3x w grach przy zachowaniu jakości wizualnie nieodróżnialnej od natywnej rozdzielczości. MetalFX działa na każdym GPU obsługującym Metal 3, bez dedykowanych rdzeni tensorowych. Integracja MetalFX z projektem wymaga około 50 linii kodu.

Śledzenie promieni w Metalu

Ray Tracing w Metal 3 jest obsługiwany na chipach M3, M4 i A17 Pro ze sprzętowymi blokami przyspieszenia (Ray Tracing Accelerators). Metal dostarcza MTLAccelerationStructure do budowy BVH i MTLIntersectionFunction do przecięcia promieni w shaderach. Gigantyczne sceny z milionami trójkątów są kompilowane do BVH w milisekundach.

Według danych Apple (2025), sprzętowe śledzenie promieni na M4 Ultra wykonuje do 40 miliardów przecięć promieni na sekundę (Giga rays/s). Jest to 4 razy szybciej niż software’owe śledzenie na M1 Ultra. Metal RT obsługuje intersection queries, dynamiczne geometrie i Motion Blur dla realistycznych animacji. Odbicia i cienie ze śledzeniem promieni działają w czasie rzeczywistym przy 60 FPS.

Unified Memory i Zero-Copy

Unified Memory — architektura Apple Silicon, gdzie CPU i GPU używają wspólnej pamięci fizycznej. Metal na Apple Silicon nie wymaga kopiowania danych między CPU a GPU: MTLBuffer w trybie shared jest dostępny dla obu procesorów bez kopiowania. Eliminuje to główne wąskie gardło tradycyjnych GPU (transfery PCIe).

Zero-Copy w Metalu pozwala CPU pisać dane do bufora, a GPU czytać je bez opóźnień. Według danych Apple (2025), daje to wzrost wydajności o 30–50% w porównaniu z dyskretnymi GPU w grach i zadaniach ML. Dla dyskretnych GPU (Mac Pro z Radeon) Metal obsługuje tryb managed z automatyczną synchronizacją przez memory barriers.

Często zadawane pytania

Czym jest Metal i do czego służy?

Metal — niskopoziomowe API Apple do pracy z GPU, zapewniające minimalne narzuty CPU. Służy do grafiki 3D, obliczeń ML, przetwarzania obrazów i symulacji na iOS, macOS i tvOS. Zastępuje OpenGL i OpenCL.

Czym różni się Metal od Vulkan?

Metal działa tylko na urządzeniach Apple, jest zintegrowany z Unified Memory i Metal Performance Shaders. Vulkan to międzyplatformowe API dla Windows, Android i Linux. Pod względem wydajności oba API są porównywalne, ale Metal ma mniejszy narzut na Apple Silicon.

Czy Metal obsługuje śledzenie promieni?

Tak, od Metal 3 na chipach M3, M4 i A17 Pro dostępne jest sprzętowe śledzenie promieni. Metal dostarcza MTLAccelerationStructure i obsługę intersection queries w shaderach. Wydajność — do 40 Giga rays/s na M4 Ultra.

Czym jest MetalFX Upscaling?

MetalFX — technologia upscalingu Apple z trybami Spatial i Temporal. Działa na każdym GPU z Metal 3, bez rdzeni tensorowych. Zapewnia wzrost wydajności do 3x z jakością zbliżoną do natywnego 4K na M4 Max.

Czy trudno zacząć pracę z Metalem?

Próg wejścia jest wyższy niż w przypadku SceneKit czy Unity ze względu na niskopoziomowe zarządzanie zasobami. Apple dostarcza Metal Sample Code i samouczki na developer.apple.com. Do podstawowego renderowania trójkąta potrzeba około 200 linii kodu.

Podsumowanie

  • Metal — niskopoziomowe API GPU Apple z minimalnymi narzutami CPU
  • MTLDevice i MTLCommandQueue — podstawa architektury z jawnym zarządzaniem zasobami
  • MTLCommandBuffer i kodery zapewniają wielowątkową rejestrację poleceń GPU
  • Metal Shading Language (C++14) obsługuje shadery vertex, fragment, compute i mesh
  • MetalFX — upscaling z przyrostem do 3x na dowolnym GPU z Metal 3
  • Sprzętowe śledzenie promieni dostępne na M3/M4/A17 Pro
  • Unified Memory na Apple Silicon eliminuje kopiowanie danych między CPU a GPU

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również