Metal — що це, графічний API та шейдери

Автор: IT Sectr Опубліковано: 2026-05-03 Час читання: 10 хв

Metal — низькорівневий графічний та обчислювальний API від Apple, що забезпечує прямий доступ до GPU на iOS, macOS та tvOS. Він замінює OpenGL та OpenCL, надаючи мінімальні накладні витрати CPU та передбачувану продуктивність. За даними Apple WWDC (2025), Metal використовується в 98% додатків із GPU-рендерингом в екосистемі Apple.

Головне

  • Metal — низькорівневий GPU API Apple з підтримкою графіки та обчислень
  • MTLDevice — абстракція GPU, через яку створюються всі ресурси Metal
  • Командні буфери MTLCommandBuffer забезпечують багатопотоковий запис команд
  • Шейдери Metal Shading Language компілюються в GPU-код на основі C++14
  • Metal Performance Shaders надають оптимізовані GPU-функції для ML та фільтрації

Що таке Metal?

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

Перша версія Metal (2014) надавала базовий API для графічного рендерингу на iOS. Metal 2 (2017) додав обчислювальні шейдери та Metal Performance Shaders. Metal 3 (2022) представив MetalFX Upscaling — власний апскейлінг Apple для ігор, конкурент 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 через композитор-сервіс для рендерингу імерсивного контенту.

Архітектура Metal: пристрій та ресурси

Архітектура Metal побудована навколо концепції явного управління: розробник створює об'єкти MTLDevice (пристрій), MTLBuffer (буфери даних), MTLTexture (текстури) та MTLCommandQueue (черга команд). На відміну від OpenGL, де стан зберігається в контексті, Metal використовує об'єкти стану, які компілюються заздалегідь.

MTLDevice — вхідна точка API

MTLDevice представляє фізичний або віртуальний GPU. Всі ресурси Metal створюються через цей об'єкт: буфери, текстури, бібліотеки шейдерів, пайплайни. У системах з декількома GPU (Mac Pro) можна вибрати конкретний пристрій. Метод supportsFamily: перевіряє підтримку функцій: трасування променів, mesh-шейдери, MetalFX.

swift
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 ГБ (на M4 Ultra). Це дозволяє працювати з великими наборами даних для ML та наукових обчислень без сегментації буферів. Пристрій також керує пулом пам'яті через MTLHeap.

MTLBuffer та MTLTexture — дані для GPU

MTLBuffer — безперервна область пам'яті, доступна GPU. Буфери використовуються для вершинних даних, матриць, uniform-змінних. Режими: shared (доступ CPU + GPU на уніфікованій пам'яті), private (тільки GPU, швидше), managed (для дискретних GPU, з синхронізацією). На Apple Silicon рекомендується shared для простоти.

MTLTexture — багатовимірний масив пікселів для текстур та render targets. Підтримуються 1D, 2D, 3D, cube та array текстури. Формати: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (стиснення), глибинні (depth32Float) та стэнсил. Texture Usage прапорці вказують, як текстура буде використовуватися: рендеринг, шейдерне читання, копіювання.

MTLLibrary та компіляція шейдерів

MTLLibrary — колекція скомпільованих GPU-функцій (шейдерів). Бібліотека може бути створена з вихідного коду MSL (Metal Shading Language) під час виконання або попередньо скомпільована та включена в bundle (.metallib). Рекомендується попередня компіляція для усунення затримок на етапі ініціалізації.

MTLFunction представляє конкретну шейдерну функцію. Вершинні шейдери (vertex), фрагментні (fragment), обчислювальні (kernel) та mesh-шейдери створюються через бібліотеку. Функції кешуються на GPU та перевикористовуються між кадрами. Аргументи шейдерів задаються через буфери та текстурні слоти з прив'язкою за індексом.

Рендеринг через Metal: командні буфери

Рендеринг в Metal організований через асинхронні черги команд. Розробник створює MTLCommandBuffer, кодує в нього команди рендерингу або обчислень та відправляє в MTLCommandQueue. GPU виконує команди послідовно, а CPU може продовжувати роботу. Синхронізація відбувається через семафори або completionHandler.

MTLCommandQueue та MTLCommandBuffer

MTLCommandQueue — черга команд, створювана з MTLDevice. Додаток може мати декілька черг для графіки, обчислень та копіювання. Кожна черга гарантує послідовне виконання команд. MTLCommandBuffer — контейнер для однієї порції роботи GPU. Після кодування він коммітиться та виконується на GPU.

swift
// Основний цикл рендерингу
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.

Render Pipeline State

MTLRenderPipelineState — скомпільований стан конвеєра рендерингу, що включає вершинний та фрагментний шейдери, конфігурацію depth-stencil, blending та формат вихідних пікселів. Створення pipeline state — дорога операція, тому об'єкти кешуються та перевикористовуються. Для різних комбінацій шейдерів створюються різні pipeline states.

Metal 3.1 представив швидкий рендеринг через Immutable Samplers, які кешуються на GPU для прискорення texture sampling. Metal підтримує до 31 текстури на шейдерний слот в середовищах Apple Silicon. На старих пристроях з A13 та нижче ліміт знижений до 16 слотів. Рекомендується об'єднувати текстури в Texture Atlases для зменшення кількості семплів.

Metal Shading Language та шейдери

Metal Shading Language (MSL) — мова програмування шейдерів на основі C++14 з розширеннями для GPU-обчислень. MSL підтримує шаблони (templates), перевантаження функцій, простори імен та адресну арифметику. Шейдери компілюються в бінарний код GPU через LLVM-бекенд Apple.

Вершинні та фрагментні шейдери

Vertex shader обробляє кожну вершину: перетворює координати зі світового простору в простір екрану, обчислює нормалі та передає дані фрагментному шейдеру. Fragment shader обчислює колір кожного пікселя: застосовує текстури, освітлення та ефекти пост-обробки.

cpp
// Вершинний шейдер 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. Буфер [buffer(0)] передає матрицю MVP як uniform-змінну. Позиція вершини обов'язково позначається [[position]] для передачі в растеризатор. Всі векторні типи MSL — float2, float3, float4 — мапляться на апаратні регістри GPU.

Обчислювальні шейдери (Compute Kernels)

Compute shader (kernel) — це GPU-функція, що виконується поза графічним конвеєром. Kernel-функції позначаються кваліфікатором kernel та виконуються в потоках (threads), організованих в групи (threadgroups). Обчислювальні шейдери використовуються для обробки зображень, симуляції фізики, ML та пост-обробки.

cpp
// 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<type> спеціалізується за типом пікселя: half (FP16), float (FP32). Compute kernels можуть запускатися з розміром grid понад 1 мільярд потоків на M4 Ultra. Максимальний розмір threadgroup — 1024 потоки на GPU Apple Silicon.

Продуктивність та Metal Performance Shaders

Metal Performance Shaders (MPS) — бібліотека оптимізованих GPU-функцій, що постачається Apple. MPS включає згорткові нейромережі (MPSNNConvolution), матричні множення (MPSMatrixMultiplication), сортування (MPSParallelSort) та обробку зображень (MPSImageGaussianBlur). Всі функції оптимізовані під конкретні GPU Apple.

MetalFX Upscaling

MetalFX — технологія апскейлінгу та згладжування, конкурент NVIDIA DLSS та AMD FSR. MetalFX пропонує два режими: Spatial (просторовий апскейлінг через алгоритм FSR 2) та Temporal (часовий апскейлінг з motion vectors). Temporal MetalFX забезпечує якість, близьку до нативного 4K, з рендеру в 1440p.

За даними Apple (2025), MetalFX Temporal на M4 Max забезпечує приріст продуктивності до 3x в іграх при збереженні якості, візуально невідмінної від нативної роздільної здатності. MetalFX працює на будь-якому GPU, що підтримує Metal 3, без виділених тензорних ядер. Інтеграція MetalFX в проект займає близько 50 рядків коду.

Трасування променів в Metal

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 рази швидше за software-трасування на M1 Ultra. Metal RT підтримує intersection queries, динамічні геометрії та Motion Blur для реалістичних анімацій. Рефлексії та тіні з трасуванням променів працюють в реальному часі при 60 FPS.

Unified Memory та Zero-Copy

Unified Memory — архітектура Apple Silicon, де CPU та GPU використовують спільну фізичну пам'ять. Metal на Apple Silicon не вимагає копіювання даних між CPU та GPU: MTLBuffer в shared mode доступний обом процесорам без копіювання. Це усуває головне вузьке місце традиційних GPU (PCIe transfers).

Zero-Copy в Metal дозволяє CPU писати дані в буфер, а GPU читати їх без затримок. За даними Apple (2025), це дає приріст продуктивності на 30–50% порівняно з дискретними GPU на іграх та ML-задачах. Для дискретних GPU (Mac Pro з Radeon) Metal підтримує managed режим з автоматичною синхронізацією через memory barriers.

Часті запитання

Що таке Metal і для чого він потрібен?

Metal — низькорівневий API Apple для роботи з GPU, що забезпечує мінімальні накладні витрати CPU. Він потрібен для 3D-графіки, ML-обчислень, обробки зображень та симуляцій на iOS, macOS та tvOS. Замінює OpenGL та OpenCL.

Чим Metal відрізняється від Vulkan?

Metal працює тільки на пристроях Apple, інтегрований з Unified Memory та Metal Performance Shaders. Vulkan — крос-платформний API для Windows, Android та Linux. За продуктивністю обидва API співставні, але Metal має менший overhead на Apple Silicon.

Чи підтримує Metal трасування променів?

Так, з Metal 3 на чипах M3, M4 та A17 Pro доступне апаратне трасування променів. Metal надає MTLAccelerationStructure та підтримку intersection queries в шейдерах. Продуктивність — до 40 Giga rays/s на M4 Ultra.

Що таке MetalFX Upscaling?

MetalFX — технологія апскейлінгу Apple з режимами Spatial та Temporal. Працює на будь-якому GPU з Metal 3, без тензорних ядер. Дає приріст продуктивності до 3x з якістю, близькою до нативного 4K на M4 Max.

Чи складно почати роботу з Metal?

Поріг входу вищий, ніж у SceneKit або Unity, через низькорівневе управління ресурсами. Apple надає Metal Sample Code та туторіали на developer.apple.com. Для базового рендерингу трикутника потрібно близько 200 рядків коду.

Підсумки

  • Metal — низькорівневий GPU API Apple з мінімальними накладними витратами CPU
  • MTLDevice та MTLCommandQueue — основа архітектури з явним управлінням ресурсами
  • MTLCommandBuffer та кодери забезпечують багатопотоковий запис команд GPU
  • Metal Shading Language (C++14) підтримує vertex, fragment, compute та mesh-шейдери
  • MetalFX — апскейлінг з приростом до 3x на будь-яких GPU з Metal 3
  • Апаратне трасування променів доступне на M3/M4/A17 Pro
  • Unified Memory на Apple Silicon усуває копіювання даних між CPU та GPU

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також