Metal је нисконивоалски графички и рачунски API од Apple који омогућује директан приступ GPU-у на iOS, macOS и tvOS. Замењује OpenGL и OpenCL, пружајући минимално оптерећење CPU и предвидливе перформансе. Према подацима Apple WWDC (2025), Metal се користи у 98% апликација са GPU рендеровањем у Apple екосистему.
Главно
Metal је нисконивоалски API за рад са графичким процесором (GPU), који је Apple представио 2014. године заједно са iOS 8 и OS X Yosemite. Metal је створен као замена за OpenGL и OpenCL са циљем смањења оптерећења CPU и пружања директнијег приступа GPU хардверу на Apple уређајима.
За разлику од OpenGL-а, где драјвер обавља више провера и трансформација на CPU-у, Metal користи модел експлицитног управљања ресурсима. Програмер контролише алокацију меморије, синхронизацију и слање наредби GPU-у, што даје побољшање перформанси до 50% у поређењу са OpenGL ES на истом хардверу.
Metal подржава све Apple чипове, почевши од A7 (2013) па до M4 Ultra (2025). API се континуирано развија: Metal 3 (2022) је додао подршку за mesh-шејдере и праћење зрака, Metal 3.1 (2023) — брзо дељење ресурса између CPU и GPU, а Metal 4 (2025) — хардверско убрзање неуронских мрежа на GPU-у са подршком за FP8 и INT4.
Прва верзија Metal-а (2014) пружала је основни API за графичко рендеровање на iOS-у. Metal 2 (2017) је додао рачунске шејдере и Metal Performance Shaders. Metal 3 (2022) је представио MetalFX Upscaling — сопствени апскејлинг за игре, конкурентан NVIDIA DLSS и AMD FSR. MetalFX омогућује побољшање перформанси до 2x на Mac-у са M2.
Metal 4 (2025) се фокусирао на машинско учење и праћење зрака. Према подацима Apple (2025), Metal 4 на M4 Ultra постиже до 80 TFLOPS у рачунским задацима при FP16 и подржава хардверско декодирање AV1. Metal сада такође подржава Apple Vision Pro кроз compositor сервис за рендеровање имерсивног садржаја.
Архитектура Metal-а је изграђена око концепта експлицитног управљања: програмер ствара MTLDevice (уређај), MTLBuffer (буфере података), MTLTexture (текстуре) и MTLCommandQueue (ред наредби). За разлику од OpenGL-а, где се стање чува у контексту, Metal користи објекте стања (state objects) који се компилирају унапред.
MTLDevice представља физички или виртуелни GPU. Сви Metal ресурси се стварају кроз овај објекат: буфери, текстуре, библиотеке шејдера, пајплајнови. У системима са више GPU-а (Mac Pro) може се изабрати одређени уређај. Метода supportsFamily: проверава подршку функција: праћење зрака, mesh-шејдери, MetalFX.
import Metal
// Добијање GPU уређаја
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError("Metal није подржан")
}
// Провера могућности
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // „Apple M4 Pro“
let maxBufferSize = device.maxBufferLength
Својство maxBufferLength одређује максималну величину буфера коју уређај подржава. На Apple Silicon-у са Unified Memory-ом лимит је до 128 GB (на M4 Ultra). Ово омогућује рад са великим скуповима података за ML и научне прорачуне без сегментације буфера. Уређај такође управља базеном меморијом кроз MTLHeap.
MTLBuffer — непрекидна област меморије доступна GPU-у. Буфери се користе за податке о теменима, матрице, uniform промењиве. Начини: shared (приступ CPU + GPU у јединственој меморији), private (само GPU, бржи), managed (за дискретне GPU-е, са синхронизацијом). На Apple Silicon-у се препоручује shared за једноставност.
MTLTexture — вишедимензионални низ пиксела за текстуре и циљне површине рендеровања. Подржавају се 1D, 2D, 3D, cube и array текстуре. Формати: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (компресија), дубински (depth32Float) и стенцил. Texture Usage заставице показују како ће текстура бити коришыена: рендеровање, читање шејдера, копирање.
MTLLibrary — збирка компилираних GPU функција (шејдера). Библиотека може бити креирана из изворног кода MSL (Metal Shading Language) у току извршавања или унапред компилирана и укључена у пакет (.metallib). Препоручује се претходна компилација за елиминисање кашњења у фази иницијализације.
MTLFunction представља одређену функцију шејдера. Вертекс шејдери (vertex), фрагмент шејдери (fragment), рачунски (kernel) и mesh-шејдери се стварају кроз библиотеку. Функције се кеширају на GPU-у и поново користе између оквира. Аргументи шејдера се постављају путем буфера и слотова текстуре са повезивањем по индексу.
Рендеровање у Metal-у је организовано кроз асинхроне редове наредби. Програмер ствара MTLCommandBuffer, кодира у њега наредбе рендеровања или рачунања и шаље у MTLCommandQueue. GPU извршава наредбе секвенцијално, а CPU може да настави рад. Синхронизација се врши путем семафора или completionHandler-а.
MTLCommandQueue — ред наредби који се ствара из MTLDevice-а. Апликација може имати више редова за графику, рачунање и копирање. Сваки ред гарантује секвенцијално извршавање наредби. MTLCommandBuffer — контејнер за један део посла GPU-а. Након кодирања, он се комитује и извршава на GPU-у.
// Главни рендер циклус
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()
Метода drawPrimitives извршава цртање геометрије. Параметар vertexCount одређује број темена. За сваки оквир ствара се нови command buffer. Present синхронизује цртање са VSync-ом екрана. Metal аутоматски управља синхронизацијом са дисплејом кроз CAMetalLayer.
MTLRenderPipelineState — компилирано стање пајплајна за рендеровање, које укључује вертекс и фрагмент шејдере, конфигурацију depth-stencil, blending и формат излазних пиксела. Креирање pipeline state-а је скупа операција, па се објекти кеширају и поново користе. За различите комбинације шејдера стварају се различити pipeline states.
Metal 3.1 је увео брзо рендеровање кроз Immutable Samplers, који се кеширају на GPU-у за убрзање узорковања текстура. Metal подржава до 31 текстуре по слоту шејдера у Apple Silicon окружењима. На старијим уређајима са A13 и ниже, лимит је смањен на 16 слотова. Препоручује се комбиновање текстура у Texture Atlases ради смањења броја узорака.
Metal Shading Language (MSL) — језик за програмирање шејдера заснован на C++14 са проширењима за GPU рачунање. MSL подржава шаблоне (templates), преоптерећење функција, именске просторе и адресну аритметику. Шејдери се компилирају у бинарни GPU код путем Apple LLVM бэкенда.
Vertex shader обрађује свако теме: трансформише координате из светског простора у простор екрана, рачуна нормале и преноси податке фрагмент шејдеру. Fragment shader рачуна боју сваког пиксела: примењује текстуре, осветљење и ефекте постпроцесирања.
// 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;
}
Атрибути [[attribute(N)]] одговарају форматима темена наведеним у MTLVertexDescriptor-u. Буфер [buffer(0)] преноси MVP матрицу као uniform промењиву. Позиција темена се мора означити са [[position]] за преношење растеризатору. Сви MSL векторски типови — float2, float3, float4 — мапирају се на хардверске GPU регистре.
Compute shader (kernel) — то је GPU функција која се извршава ван графичког пајплајна. Kernel функције се означавају квалификатором kernel и извршавају у нитима (threads) организованим у групе (threadgroups). Рачунски шејдери се користе за обраду слика, симулацију физике, ML и постпроцесирање.
// Compute kernel за замућење слике
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);
}
Параметар gid [[thread_position_in_grid]] садржи јединствени индекс нити. Texture2D
Metal Performance Shaders (MPS) — библиотека оптимизованих GPU функција коју испоручује Apple. MPS укључује конволуционе неуронске мреже (MPSNNConvolution), матрично множење (MPSMatrixMultiplication), сортирање (MPSParallelSort) и обраду слика (MPSImageGaussianBlur). Све функције су оптимизоване за одређене Apple GPU-е.
MetalFX — технологија апскејлинга и изглађивања, конкурентна NVIDIA DLSS-у и AMD FSR-у. MetalFX нуди два режима: Spatial (просторни апскејлинг кроз FSR 2 алгоритам) и Temporal (временски апскејлинг са векторима покрета). Temporal MetalFX пружа квалитет близак нативном 4K-у из рендера на 1440p.
Према подацима Apple (2025), MetalFX Temporal на M4 Max-у омогућује побољшање перформанси до 3x у играма уз задржавање квалитета који је визуелно неразличив од нативног резолуције. MetalFX ради на сваком GPU-у који подржава Metal 3, без посебних тензорских језгара. Интеграција MetalFX-а у пројекат захтева око 50 линија кода.
Ray Tracing у Metal 3 је подржан на чиповима M3, M4 и A17 Pro са хардверским блоковима за убрзање (Ray Tracing Accelerators). Metal пружа MTLAccelerationStructure за изградњу BVH-а и MTLIntersectionFunction за пресецање зрака у шејдерима. Огромне сцене са милионима троуглова компилирају се у BVH за милисекунде.
Према подацима Apple (2025), хардверско праћење зрака на M4 Ultra извршава до 40 милијарди пресецања зрака у секунди (Giga rays/s). Ово је 4 пута брже од софтверског праћења зрака на M1 Ultra. Metal RT подржава intersection queries, динамичке геометрије и Motion Blur за реалистичне анимације. Рефлексије и сенке са праћењем зрака раде у реалном времену при 60 FPS.
Unified Memory — архитектура Apple Silicon-а где CPU и GPU користе исту физичку меморију. Metal на Apple Silicon-у не захтева копирање података између CPU-а и GPU-а: MTLBuffer у shared начину је доступан оба процесора без копирања. Ово елиминише главно уско грло традиционалних GPU-а (PCIe трансфери).
Zero-Copy у Metal-у омогућује CPU-у да пише податке у буфер, а GPU да их чита без кашњења. Према подацима Apple (2025), ово даје побољшање перформанси од 30–50% у поређењу са дискретним GPU-ама на играма и ML задацима. За дискретне GPU-е (Mac Pro са Radeon-ом), Metal подржава managed начин са аутоматском синхронизацијом кроз memory barriers.
Често постављана питања
Metal — нисконивоалски Apple API за рад са GPU-ом, који омогућује минимално оптерећење CPU. Потребан је за 3D графику, ML прорачуне, обраду слика и симулације на iOS, macOS и tvOS. Замењује OpenGL и OpenCL.
Metal ради само на Apple уређајима, интегрисан је са Unified Memory-ом и Metal Performance Shaders-има. Vulkan је вишеплатформски API за Windows, Android и Linux. По перформансама, оба API-ја су упоредива, али Metal има мањи overhead на Apple Silicon-у.
Да, од Metal 3 на чиповима M3, M4 и A17 Pro доступно је хардверско праћење зрака. Metal пружа MTLAccelerationStructure и подршку intersection queries у шејдерима. Перформансе — до 40 Giga rays/s на M4 Ultra.
MetalFX — Apple-ова технологија апскејлинга са Spatial и Temporal режимима. Ради на сваком GPU-у са Metal 3, без тензорских језгара. Пружа побољшање перформанси до 3x са квалитетом блиским нативном 4K-у на M4 Max-у.
Праг уласка је виши него код SceneKit-а или Unity-ја због нисконивоалског управљања ресурсима. Apple пружа Metal Sample Code и туторијале на developer.apple.com. За основно рендеровање троугла потребно је око 200 линија кода.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође