Metal — bu nima, grafik API va shaderlar

Muallif: IT Sectr Nashr etilgan: 2026-05-03 O'qish vaqti: 10 daq

Metal — Apple tomonidan iOS, macOS va tvOS-da GPU-ga to‘g‘ridan-to‘g‘ri kirishni ta‘minlaydigan past darajadagi grafik va hisoblash API-sidir. U OpenGL va OpenCL o‘rnini bosadi, minimal CPU yuklamasi va bashorat qilinadigan unumdorlikni taqdim etadi. Apple WWDC (2025) ma‘lumotlariga ko‘ra, Metal Apple ekotizimidagi GPU renderlashga ega ilovalarning 98 foizida qo‘llaniladi.

Asosiy ma‘lumotlar

  • Metal — grafik va hisoblashni qo‘llab-quvvatlaydigan Apple-ning past darajadagi GPU API-si
  • MTLDevice — barcha Metal resurslari yaratiladigan GPU abstraksiyasi
  • Komanda buferlari MTLCommandBuffer ko‘p oqimli buyruq yozishni ta‘minlaydi
  • Metal Shading Language shaderlari C++14 asosida GPU kodiga kompilyatsiya qilinadi
  • Metal Performance Shaders ML va filtrlash uchun optimallashtirilgan GPU funksiyalarini taqdim etadi

Metal nima?

Metal — bu Apple tomonidan 2014-yilda iOS 8 va OS X Yosemite bilan birga taqdim etilgan grafik protsessor (GPU) bilan ishlash uchun past darajadagi API. Metal CPU yuklamasini kamaytirish va Apple qurilmalarida GPU apparatiga to‘g‘ridan-to‘g‘ri kirishni ta‘minlash maqsadida OpenGL va OpenCL o‘rnini bosuvchi sifatida yaratilgan.

Drayver CPU-da ko‘plab tekshirish va transformatsiyalarni amalga oshiradigan OpenGL-dan farqli o‘laroq, Metal resurslarni aniq boshqarish modelidan foydalanadi. Dasturchi xotira ajratish, sinxronizatsiya va GPU buyruqlarini yuborishni nazorat qiladi, bu esa bir xil uskunada OpenGL ES bilan solishtirganda unumdorlikni 50% gacha oshiradi.

Metal barcha Apple chiplarini qo‘llab-quvvatlaydi, A7 (2013) dan M4 Ultra (2025) gacha. API doimiy ravishda rivojlanmoqda: Metal 3 (2022) mesh-shaderlar va nur kuzatish qo‘shdi, Metal 3.1 (2023) — CPU va GPU o‘rtasida tez resurs almashinuvi, Metal 4 (2025) esa — FP8 va INT4 qo‘llab-quvvatlashi bilan GPU-da neyron tarmoqlarni apparat tezlashtirishi.

Metal tarixi

Metal-ning birinchi versiyasi (2014) iOS-da grafik renderlash uchun asosiy API ni taqdim etdi. Metal 2 (2017) hisoblash shaderlari va Metal Performance Shaders qo‘shdi. Metal 3 (2022) MetalFX Upscaling — NVIDIA DLSS va AMD FSR raqobatchisi bo‘lgan o‘zining upscaling texnologiyasini taqdim etdi. MetalFX M2 bilan Mac-da unumdorlikni 2x gacha oshiradi.

Metal 4 (2025) mashinani o‘rganish va nur kuzatishga e‘tibor qaratdi. Apple (2025) ma‘lumotlariga ko‘ra, Metal 4 M4 Ultra da FP16 hisoblash topshiriqlarida 80 TFLOPS gacha yetadi va AV1 apparat dekodlashni qo‘llab-quvvatlaydi. Metal endi Apple Vision Pro da ham immersiv kontent renderlash uchun kompozitor xizmati orqali qo‘llab-quvvatlanadi.

Metal arxitekturasi: qurilma va resurslar

Metal arxitekturasi aniq boshqarish kontseptsiyasi atrofida qurilgan: dasturchi MTLDevice (qurilma), MTLBuffer (ma‘lumot buferlari), MTLTexture (teksturalar) va MTLCommandQueue (buyruq navbati) ob‘ektlarini yaratadi. Holat kontekstda saqlanadigan OpenGL-dan farqli o‘laroq, Metal oldindan kompilyatsiya qilinadigan holat ob‘ektlaridan (state objects) foydalanadi.

MTLDevice — API kirish nuqtasi

MTLDevice jismoniy yoki virtual GPU ni ifodalaydi. Barcha Metal resurslari ushbu ob‘ekt orqali yaratiladi: buferlar, teksturalar, shader kutubxonalari, pipeline-lar. Bir nechta GPU-ga ega tizimlarda (Mac Pro) ma‘lum bir qurilmani tanlash mumkin. supportsFamily: metodi funksiyalarni qo‘llab-quvvatlashni tekshiradi: nur kuzatish, mesh-shaderlar, MetalFX.

swift
import Metal
 
// GPU qurilmasini olish
guard let device = MTLCreateSystemDefaultDevice() else {
    fatalError("Metal qo‘llab-quvvatlanmaydi")
}
 
// Imkoniyatlarni tekshirish
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // „Apple M4 Pro”
let maxBufferSize = device.maxBufferLength

maxBufferLength xususiyati qurilma qo‘llab-quvvatlaydigan maksimal bufer hajmini aniqlaydi. Unified Memory bilan Apple Silicon da limit M4 Ultra da 128 GB gacha. Bu buferlarni segmentatsiyasiz ML va ilmiy hisoblashlar uchun katta ma‘lumotlar to‘plamlari bilan ishlashga imkon beradi. Qurilma shuningdek MTLHeap orqali xotira hovuzini boshqaradi.

MTLBuffer va MTLTexture — GPU uchun ma‘lumotlar

MTLBuffer — GPU uchun mavjud uzluksiz xotira maydoni. Buferlar uchburchak uchlari ma‘lumotlari, matritsalar, uniform o‘zgaruvchilar uchun ishlatiladi. Rejimlar: shared (unifikatsiyalangan xotirada CPU + GPU kirishi), private (faqat GPU, tezroq), managed (diskret GPU lar uchun, sinxronizatsiya bilan). Apple Silicon da soddalik uchun shared tavsiya etiladi.

MTLTexture — teksturalar va render nishonlari uchun ko‘p o‘lchovli piksel massivi. 1D, 2D, 3D, cube va array teksturalar qo‘llab-quvvatlanadi. Formatlar: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (siqish), chuqurlik (depth32Float) va stencil. Texture Usage bayroqlari teksturaning qanday ishlatilishini ko‘rsatadi: renderlash, shader o‘qish, nusxa ko‘chirish.

MTLLibrary va shader kompilyatsiyasi

MTLLibrary — kompilyatsiya qilingan GPU funksiyalari (shaderlar) to‘plami. Kutubxona ish vaqtida MSL (Metal Shading Language) manba kodidan yoki oldindan kompilyatsiya qilinib paketga (.metallib) qo‘shilgan holda yaratilishi mumkin. Ishga tushirish bosqichidagi kechikishlarni bartaraf etish uchun oldindan kompilyatsiya tavsiya etiladi.

MTLFunction ma‘lum bir shader funksiyasini ifodalaydi. Vertex shaderlar, fragment shaderlar, hisoblash (kernel) va mesh-shaderlar kutubxona orqali yaratiladi. Funksiyalar GPU-da keshlanadi va freymlar o‘rtasida qayta ishlatiladi. Shader argumentlari indeks bo‘yicha bog‘lash bilan buferlar va tekstura uyalari orqali belgilanadi.

Metal orqali renderlash: komanda buferlari

Metal da renderlash asinxron buyruq navbatlari orqali tashkil etiladi. Dasturchi MTLCommandBuffer yaratadi, unga renderlash yoki hisoblash buyruqlarini kodlaydi va MTLCommandQueue ga yuboradi. GPU buyruqlarni ketma-ket bajaradi, CPU esa ishini davom ettirishi mumkin. Sinxronizatsiya semaforlar yoki completionHandler orqali amalga oshiriladi.

MTLCommandQueue va MTLCommandBuffer

MTLCommandQueue — MTLDevice dan yaratiladigan buyruq navbati. Ilova grafik, hisoblash va nusxa ko‘chirish uchun bir nechta navbatga ega bo‘lishi mumkin. Har bir navbat buyruqlarning ketma-ket bajarilishini kafolatlaydi. MTLCommandBuffer — bir GPU ish qismi uchun konteyner. Kodlashdan so‘ng u tasdiqlanadi va GPU-da bajariladi.

swift
// Asosiy renderlash sikli
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 metodi geometriyani chizishni amalga oshiradi. vertexCount parametri uchlarning sonini ko‘rsatadi. Har bir freym uchun yangi command buffer yaratiladi. Present chizishni ekran VSync si bilan sinxronlashtiradi. Metal CAMetalLayer orqali displey bilan sinxronizatsiyani avtomatik boshqaradi.

Render Pipeline State

MTLRenderPipelineState — vertex va fragment shaderlari, depth-stencil konfiguratsiyasi, blending va chiqish piksel formatini o‘z ichiga olgan render pipeline-ning kompilyatsiya qilingan holati. Pipeline state yaratish qimmat operatsiya, shuning uchun ob‘ektlar keshlanadi va qayta ishlatiladi. Turli shader kombinatsiyalari uchun turli pipeline states yaratiladi.

Metal 3.1 tekstura namuna olishni tezlashtirish uchun GPU-da keshlanadigan Immutable Samplers orqali tez renderlash ni taqdim etdi. Metal Apple Silicon muhitlarida shader uyasi uchun 31 tagacha teksturani qo‘llab-quvvatlaydi. A13 va undan eski qurilmalarda limit 16 uyaga tushiriladi. Namunalar sonini kamaytirish uchun teksturalarni Texture Atlases da birlashtirish tavsiya etiladi.

Metal Shading Language va shaderlar

Metal Shading Language (MSL) — GPU hisoblashlari uchun kengaytmalar bilan C++14 asosidagi shader dasturlash tili. MSL shablonlar (templates), funksiyalarni yuklash, nom maydonlari va manzil arifmetikasini qo‘llab-quvvatlaydi. Shaderlar Apple LLVM backend-i orqali GPU ikkilik kodiga kompilyatsiya qilinadi.

Vertex va fragment shaderlar

Vertex shader har bir uchni qayta ishlaydi: koordinatalarni dunyo fazosidan ekran fazosiga o‘zgartiradi, normallarni hisoblaydi va ma‘lumotlarni fragment shader ga uzatadi. Fragment shader har bir pikselning rangini hisoblaydi: teksturalarni, yoritishni va post-ishlov effektlarini qo‘llaydi.

cpp
// Metal vertex shaderi
#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)]] atributlari MTLVertexDescriptor da belgilangan uch formatlariga mos keladi. [buffer(0)] buferi MVP matritsasini uniform o‘zgaruvchi sifatida uzatadi. Uchning pozitsiyasi rastrizatorga uzatish uchun [[position]] bilan belgilanishi kerak. Barcha MSL vektor turlari — float2, float3, float4 — GPU apparat registrlariga xaritalanadi.

Hisoblash shaderlari (Compute Kernels)

Compute shader (kernel) — grafik pipeline-dan tashqarida bajariladigan GPU funksiyasi. Kernel funksiyalari kvalifikatori kernel bilan belgilanadi va threadgroups da tashkil etilgan oqimlarda (threads) bajariladi. Hisoblash shaderlari tasvirni qayta ishlash, fizika simulyatsiyasi, ML va post-ishlov uchun ishlatiladi.

cpp
// Tasvirni xiralashtirish uchun 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]] parametri noyob oqim indeksini o‘z ichiga oladi. Texture2D piksel turiga qarab ixtisoslashadi: half (FP16), float (FP32). Compute kernels M4 Ultra da 1 milliarddan ortiq oqim grid o‘lchami bilan ishga tushirilishi mumkin. Apple Silicon GPU da maksimal threadgroup o‘lchami 1024 oqim.

Unumdorlik va Metal Performance Shaders

Metal Performance Shaders (MPS) — Apple tomonidan taqdim etilgan optimallashtirilgan GPU funksiyalari kutubxonasi. MPS konvolyutsion neyron tarmoqlar (MPSNNConvolution), matritsa ko‘paytirish (MPSMatrixMultiplication), tartiblash (MPSParallelSort) va tasvirni qayta ishlash (MPSImageGaussianBlur) ni o‘z ichiga oladi. Barcha funksiyalar ma‘lum Apple GPU lari uchun optimallashtirilgan.

MetalFX Upscaling

MetalFX — NVIDIA DLSS va AMD FSR raqobatchisi bo‘lgan upscaling va silliqlash texnologiyasi. MetalFX ikki rejimni taklif qiladi: Spatial (FSR 2 algoritmi orqali fazoviy upscaling) va Temporal (harakat vektorlari bilan vaqtinchalik upscaling). Temporal MetalFX 1440p renderdan tabiiy 4K ga yaqin sifatni ta‘minlaydi.

Apple (2025) ma‘lumotlariga ko‘ra, MetalFX Temporal M4 Max da o‘yinlarda sifatni saqlagan holda unumdorlikni 3x gacha oshiradi, vizual jihatdan tabiiy ruxsatdan farqlanmaydi. MetalFX maxsus tensor yadrolarisiz Metal 3 ni qo‘llab-quvvatlovchi har qanday GPU da ishlaydi. MetalFX ni loyihaga integratsiyalash taxminan 50 satr kodni talab qiladi.

Metal da nur kuzatish

Ray Tracing Metal 3 da M3, M4 va A17 Pro chiplarida apparat tezlashtirish bloklari (Ray Tracing Accelerators) bilan qo‘llab-quvvatlanadi. Metal BVH qurish uchun MTLAccelerationStructure va shaderlarda nurlarni kesishish uchun MTLIntersectionFunction ni taqdim etadi. Millionlab uchburchakli ulkan sahnalar millisekundlarda BVH ga kompilyatsiya qilinadi.

Apple (2025) ma‘lumotlariga ko‘ra, M4 Ultra da apparat nur kuzatishi sekundiga 40 milliardgacha nur kesishishini (Giga rays/s) bajaradi. Bu M1 Ultra dagi dasturiy nur kuzatishidan 4 barobar tezroq. Metal RT kesishish so‘rovlarini, dinamik geometriyani va realistik animatsiyalar uchun Motion Blur ni qo‘llab-quvvatlaydi. Nur kuzatishi bilan akslar va soyalar real vaqtda 60 FPS da ishlaydi.

Unified Memory va Zero-Copy

Unified Memory — CPU va GPU umumiy jismoniy xotiradan foydalanadigan Apple Silicon arxitekturasi. Apple Silicon da Metal CPU va GPU o‘rtasida ma‘lumotlarni nusxalashni talab qilmaydi: shared rejimidagi MTLBuffer nusxalashsiz ikkala protsessor uchun ham mavjud. Bu an‘anaviy GPU larning asosiy tor bo‘ynini (PCIe uzatmalari) bartaraf etadi.

Metal da Zero-Copy CPU ga buferga ma‘lumot yozish va GPU ga ularni kechikishsiz o‘qish imkonini beradi. Apple (2025) ma‘lumotlariga ko‘ra, bu o‘yinlar va ML topshiriqlarida diskret GPU larga nisbatan unumdorlikni 30–50% oshiradi. Diskret GPU lar (Radeon bilan Mac Pro) uchun Metal xotira to‘siqlari (memory barriers) orqali avtomatik sinxronizatsiya bilan managed rejimini qo‘llab-quvvatlaydi.

Tez-tez beriladigan savollar

Metal nima va u nima uchun kerak?

Metal — Apple-ning GPU bilan ishlash uchun past darajadagi API si, minimal CPU yuklamasini ta‘minlaydi. 3D grafikasi, ML hisoblashlari, tasvirni qayta ishlash va simulyatsiyalar uchun iOS, macOS va tvOS da kerak. OpenGL va OpenCL o‘rnini bosadi.

Metal Vulkan dan qanday farq qiladi?

Metal faqat Apple qurilmalarida ishlaydi, Unified Memory va Metal Performance Shaders bilan integratsiyalangan. Vulkan Windows, Android va Linux uchun platformalararo API. Unumdorlik bo‘yicha ikkala API solishtirish mumkin, ammo Metal Apple Silicon da kamroq yuklamaga ega.

Metal nur kuzatishni qo‘llab-quvvatlaydimi?

Ha, Metal 3 dan boshlab M3, M4 va A17 Pro chiplarida apparat nur kuzatishi mavjud. Metal MTLAccelerationStructure va shaderlarda kesishish so‘rovlarini qo‘llab-quvvatlaydi. Unumdorlik — M4 Ultra da 40 Giga rays/s gacha.

MetalFX Upscaling nima?

MetalFX — Apple-ning Spatial va Temporal rejimlari bilan upscaling texnologiyasi. Tensor yadrolarisiz Metal 3 bilan har qanday GPU da ishlaydi. M4 Max da tabiiy 4K ga yaqin sifat bilan 3x gacha unumdorlikni oshiradi.

Metal bilan ishlashni boshlash qiyinmi?

Kirish chegarasi past darajadagi resurs boshqaruvi tufayli SceneKit yoki Unity dan yuqori. Apple Metal Sample Code va developer.apple.com saytida qo‘llanmalarni taqdim etadi. Asosiy uchburchak renderlash uchun taxminan 200 satr kod kerak bo‘ladi.

Xulosalar

  • Metal — minimal CPU yuklamasi bilan past darajadagi Apple GPU API si
  • MTLDevice va MTLCommandQueue — resurslarni aniq boshqarish bilan arxitekturaning asosi
  • MTLCommandBuffer va koderlar ko‘p oqimli GPU buyruq yozishni ta‘minlaydi
  • Metal Shading Language (C++14) vertex, fragment, compute va mesh shaderlarni qo‘llab-quvvatlaydi
  • MetalFX — Metal 3 bilan har qanday GPU da 3x gacha oshirish bilan upscaling
  • Apparat nur kuzatishi M3/M4/A17 Pro da mavjud
  • Unified Memory Apple Silicon da CPU va GPU o‘rtasida ma‘lumot nusxalashni bartaraf etadi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing