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 — собствена технология за ъпскейлинг за игри, конкурентна на 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: устройство и ресурси

Архитектурата на Metal е изградена около концепцията за изрично управление: разработчикът създава обекти MTLDevice (устройство), MTLBuffer (буфери с данни), MTLTexture (текстури) и MTLCommandQueue (опашка от команди). За разлика от OpenGL, където състоянието се съхранява в контекст, Metal използва обекти на състоянието (state objects), които се компилират предварително.

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 GB (на M4 Ultra). Това позволява работа с големи набори от данни за ML и научни изчисления без сегментиране на буфери. Устройството също управлява пула от памет чрез MTLHeap.

MTLBuffer и MTLTexture — данни за GPU

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 и компилация на шейдъри

MTLLibrary — колекция от компилирани GPU функции (шейдъри). Библиотеката може да бъде създадена от изходен код MSL (Metal Shading Language) по време на изпълнение или предварително компилирана и включена в пакета (.metallib). Предварителната компилация се препоръчва за премахване на закъсненията във фазата на инициализация.

MTLFunction представлява конкретна шейдърна функция. Вертекс шейдъри, фрагмент шейдъри, изчислителни (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.

Състояние на рендериращия пайплайн

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 и шейдъри

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

Вертекс и фрагмент шейдъри

Vertex shader обработва всеки връх: трансформира координати от световното пространство в пространството на екрана, изчислява нормали и предава данни на фрагментния шейдър. Fragment shader изчислява цвета на всеки пиксел: прилага текстури, осветление и ефекти на последваща обработка.

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

Производителност и 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 (времеви ъпскейлинг с вектори на движение). Temporal MetalFX осигурява качество, близко до native 4K от рендериране в 1440p.

Според данни на Apple (2025), MetalFX Temporal на M4 Max осигурява увеличение на производителността до 3x в игри при запазване на качество, визуално неразличимо от native разделителна способност. 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 пъти по-бързо от софтуерното проследяване на лъчи на 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 режим е достъпен и за двата процесора без копиране. Това елиминира основното тясно място на традиционните GPU (PCIe трансфери).

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

Често задавани въпроси

Какво е Metal и за какво се използва?

Metal — ниско ниво Apple API за работа с 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 с качество, близко до native 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 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също