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 представлява конкретна шейдърна функция. Вертекс шейдъри, фрагмент шейдъри, изчислителни (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 изчислява цвета на всеки пиксел: прилага текстури, осветление и ефекти на последваща обработка.
// Vertex шейдър на 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 (времеви ъпскейлинг с вектори на движение). Temporal MetalFX осигурява качество, близко до native 4K от рендериране в 1440p.
Според данни на Apple (2025), MetalFX Temporal на M4 Max осигурява увеличение на производителността до 3x в игри при запазване на качество, визуално неразличимо от native разделителна способност. 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 с качество, близко до native 4K на M4 Max.
Прагът на влизане е по-висок от SceneKit или Unity поради ниско ниво управление на ресурсите. Apple предоставя Metal Sample Code и уроци на developer.apple.com. За основно рендериране на триъгълник са необходими около 200 реда код.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също