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-сервис для рендеринга immersive-контента.
Архитектура 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 ГБ (на M4 Ultra). Это позволяет работать с большими наборами данных для ML и научных вычислений без сегментации буферов. Device также управляет пулом памяти через MTLHeap.
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 — коллекция скомпилированных GPU-функций (шейдеров). Библиотека может быть создана из исходного кода MSL (Metal Shading Language) во время выполнения или предварительно скомпилирована и включена в bundle (.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 представил fast рендеринг через Immutable Samplers, которые кэшируются на GPU для ускорения texture sampling. Метал поддерживает до 31 текстуры на шейдерный слот в средах Apple Silicon. На старых устройствах с A13 и ниже лимит снижен до 16 слотов. Рекомендуется объединять текстуры в Texture Atlases для уменьшения числа сэмплов.
Metal Shading Language (MSL) — язык программирования шейдеров на основе C++14 с расширениями для GPU-вычислений. MSL поддерживает шаблоны (templates), перегрузку функций, пространства имён и адресную арифметику. Шейдеры компилируются в бинарный код GPU через LLVM-бэкенд Apple.
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. Буфер [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). Все функции оптимизированы под конкретные GPU Apple.
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 строк кода.
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 — архитектура 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 — низкоуровневый API Apple для работы с 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также