Metal — nədir, qrafik API və shaderlər

Müəllif: IT Sectr Dərc olunub: 2026-05-03 Oxuma vaxtı: 10 dəq

Metal — Apple tərəfindən iOS, macOS və tvOS-da GPU-ya birbaşa çıxışı təmin edən aşağı səviyyəli qrafik və hesablama API-sidir. OpenGL və OpenCL-i əvəz edərək, minimal CPU yükü və proqnozlaşdırıla bilən performans təmin edir. Apple WWDC (2025) məlumatlarına görə, Metal Apple ekosistemində GPU renderinqi olan tətbiqlərin 98%-də istifadə olunur.

Əsas məqamlar

  • Metal — qrafik və hesablamaları dəstəkləyən aşağı səviyyəli Apple GPU API-si
  • MTLDevice — bütün Metal resurslarının yaradıldığı GPU abstraksiyası
  • Əmr buferləri MTLCommandBuffer çoxprosessorlu əmr yazılmasını təmin edir
  • Metal Shading Language shaderləri C++14 əsasında GPU koduna kompilyasiya olunur
  • Metal Performance Shaders ML və filtrasiya üçün optimallaşdırılmış GPU funksiyaları təqdim edir

Metal nədir?

Metal — Apple tərəfindən 2014-cü ildə iOS 8 və OS X Yosemite ilə birlikdə təqdim edilmiş qrafik prosessoru (GPU) ilə iş üçün aşağı səviyyəli API-dir. Metal, CPU yükünü azaltmaq və Apple cihazlarında GPU aparatına daha birbaşa çıxışı təmin etmək məqsədi ilə OpenGL və OpenCL-in əvəzi kimi yaradılmışdır.

OpenGL-dən fərqli olaraq, burada sürücü CPU-da çoxsaylı yoxlama və transformasiyalar yerinə yetirir, Metal açıq resurs idarəetmə modelindən istifadə edir. Tərtibatçı yaddaş ayrılmasını, sinxronizasiyanı və GPU əmrlərinin göndərilməsini idarə edir ki, bu da eyni avadanlıqda OpenGL ES ilə müqayisədə performansı 50%-ə qədər artırır.

Metal bütün Apple çiplərini dəstəkləyir, A7 (2013) ilə başlayaraq M4 Ultra (2025)-dək. API daim inkişaf edir: Metal 3 (2022) mesh-shaderlər və şüa izləmə dəstəyi əlavə etdi, Metal 3.1 (2023) — CPU və GPU arasında sürətli resurs paylaşımı, Metal 4 (2025) isə — FP8 və INT4 dəstəyi ilə GPU-da neyron şəbəkələrin aparat sürətləndirilməsi.

Metalın tarixi

Metalın ilk versiyası (2014) iOS-da qrafik renderinq üçün əsas API təmin edirdi. Metal 2 (2017) hesablama shaderləri və Metal Performance Shaders əlavə etdi. Metal 3 (2022) MetalFX Upscaling — NVIDIA DLSS və AMD FSR rəqibi olan özünün upscaling texnologiyasını təqdim etdi. MetalFX M2 ilə Mac-da performansı 2x-dək artırır.

Metal 4 (2025) maşın öyrənməsi və şüa izləməyə fokuslandı. Apple (2025) məlumatlarına görə, Metal 4 M4 Ultra-da FP16 hesablama tapşırıqlarında 80 TFLOPS-a qədər çatır və AV1 aparat dekodlaşdırılmasını dəstəkləyir. Metal indi Apple Vision Pro-da da immersiv məzmun renderinqi üçün compositor-xidməti vasitəsilə dəstəklənir.

Metal arxitekturası: cihaz və resurslar

Metal arxitekturası açıq idarəetmə konsepsiyası ətrafında qurulub: tərtibatçı MTLDevice (cihaz), MTLBuffer (məlumat buferləri), MTLTexture (fakturalar) və MTLCommandQueue (əmr növbəsi) obyektlərini yaradır. Vəziyyətin kontekstdə saxlanıldığı OpenGL-dən fərqli olaraq, Metal əvvəlcədən kompilyasiya olunan vəziyyət obyektlərindən (state objects) istifadə edir.

MTLDevice — API giriş nöqtəsi

MTLDevice fiziki və ya virtual GPU-nu təmsil edir. Bütün Metal resursları bu obyekt vasitəsilə yaradılır: buferlər, fakturalar, shader kitabxanaları, pipeline-lar. Bir neçə GPU-su olan sistemlərdə (Mac Pro) müəyyən cihaz seçilə bilər. supportsFamily: metodu funksiyaların dəstəyini yoxlayır: şüa izləmə, mesh-shaderlər, MetalFX.

swift
import Metal
 
// GPU cihazının əldə edilməsi
guard let device = MTLCreateSystemDefaultDevice() else {
    fatalError("Metal dəstəklənmir")
}
 
// İmkanların yoxlanması
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // „Apple M4 Pro”
let maxBufferSize = device.maxBufferLength

maxBufferLength xassəsi cihazın dəstəklədiyi maksimum bufer ölçüsünü müəyyənləşdirir. Unified Memory ilə Apple Silicon-da limit M4 Ultra-da 128 GB-a qədərdir. Bu, buferlərin seqmentasiyası olmadan ML və elmi hesablamalar üçün böyük məlumat dəstləri ilə işləməyə imkan verir. Cihaz həmçinin MTLHeap vasitəsilə yaddaş hovuzunu idarə edir.

MTLBuffer və MTLTexture — GPU üçün məlumatlar

MTLBuffer — GPU üçün əlçatan fasiləsiz yaddaş sahəsi. Buferlər təpə məlumatları, matrislər, uniform dəyişənlər üçün istifadə olunur. Rejimlər: shared (unikal yaddaşda CPU + GPU üçün əlçatan), private (yalnız GPU, daha sürətli), managed (diskret GPU-lar üçün, sinxronizasiya ilə). Apple Silicon-da sadəlik üçün shared tövsiyə olunur.

MTLTexture — fakturalar və render hədəfləri üç÷n çoxölçülü piksel massivi. 1D, 2D, 3D, cube və array fakturalar dəstəklənir. Formatlar: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (sıxılma), dərinlik (depth32Float) və stencil. Texture Usage bayraqları fakturanın necə istifadə ediləcəyini göstərir: renderinq, shader oxuması, kopyalama.

MTLLibrary və shader kompilyasiyası

MTLLibrary — kompilyasiya olunmuş GPU funksiyalarının (shaderlərin) kolleksiyası. Kitabxana iş vaxtı ərzində MSL (Metal Shading Language) mənbə kodundan və ya əvvəlcədən kompilyasiya edilərək paketə (.metallib) daxil edilə bilər. Başlatma mərhələsində gecikmələri aradan qaldırmaq üçün əvvəlcədən kompilyasiya tövsiyə olunur.

MTLFunction müəyyən shader funksiyasını təmsil edir. Vertex shaderlər, fragment shaderlər, hesablama (kernel) və mesh-shaderlər kitabxana vasitəsilə yaradılır. Funksiyalar GPU-da keşlənir və çərçivələr arasında təkrar istifadə olunur. Shader arqumentləri indeks bağlantısı ilə buferlər və faktura yuvaları vasitəsilə təyin edilir.

Metal vasitəsilə renderinq: əmr buferləri

Metal-da renderinq asinxron əmr növbələri vasitəsilə təşkil olunur. Tərtibatçı MTLCommandBuffer yaradır, ona renderinq və ya hesablama əmrləri kodlayır və MTLCommandQueue-yə göndərir. GPU əmrləri ardıcıl yerinə yetirir, CPU isə işinə davam edə bilər. Sinxronizasiya semaforlar və ya completionHandler vasitəsilə baş verir.

MTLCommandQueue və MTLCommandBuffer

MTLCommandQueue — MTLDevice-dən yaradılan əmr növbəsi. Tətbiq qrafik, hesablama və kopyalama üçün bir neçə növbəyə malik ola bilər. Hər növbə əmrlərin ardıcıl yerinə yetirilməsini təmin edir. MTLCommandBuffer — bir GPU iş hissəsi üçün konteyner. Kodlamadan sonra o, təsdiqlənir və GPU-da yerinə yetirilir.

swift
// Əsas renderinq dövri
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 metodu həndəsənin çəkilməsini yerinə yetirir. vertexCount parametri təpələrin sayını göstərir. Hər çərçivə üçün yeni command buffer yaradılır. Present çəkilməni ekranın VSync-i ilə sinxronlaşdırır. Metal CAMetalLayer vasitəsilə displeylə sinxronizasiyanı avtomatik idarə edir.

Render Pipeline State

MTLRenderPipelineState — vertex və fragment shaderləri, depth-stencil konfiqurasiyası, blending və çıxış piksel formatını əhatə edən renderinq pipeline-ının kompilyasiya olunmuş vəziyyətidir. Pipeline state yaratmaq bahalı əməliyyatdır, ona görə obyektlər keşlənir və təkrar istifadə olunur. Müxtəlif shader kombinasiyaları üçün fərqli pipeline states yaradılır.

Metal 3.1 tekstur nümunə götürülməsini sürətləndirmək üçün GPU-da keşlənən Immutable Samplers vasitəsilə sürətli renderinq təqdim etdi. Metal Apple Silicon mühitlərində shader yuvası başına 31 faktura qədər dəstəkləyir. A13 və daha köhnə cihazlarda limit 16 yuvaya endirilir. Nümunələrin sayını azaltmaq üçün fakturaların Texture Atlases-də birləşdirilməsi tövsiyə olunur.

Metal Shading Language və shaderlər

Metal Shading Language (MSL) — GPU hesablamaları üçün genişləndirmələrlə C++14 əsasında shader proqramlaşdırma dilidir. MSL şablonları (templates), funksiyaların yüklənməsini, ad fəzalarını və ünvan arifmetikasını dəstəkləyir. Shaderlər Apple LLVM backend-i vasitəsilə GPU ikili koduna kompilyasiya olunur.

Vertex və fragment shaderləri

Vertex shader hər təpəni emal edir: koordinatları dünya fəzasından ekran fəzasına çevirir, normalları hesablayır və məlumatları fragment shader-ə ötürür. Fragment shader hər pikselin rəngini hesablayır: fakturaları, işıqlandırmanı və post-emal effektlərini tətbiq edir.

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)]] atributları MTLVertexDescriptor-da müəyyən edilmiş vertex formatlarına uyğundur. [buffer(0)] buferi MVP matrisini uniform dəyişən kimi ötürür. Təpənin mövqeyi rasterizatora ötürülmək üçün mütləq [[position]] ilə qeyd olunmalıdır. Bütün MSL vektor tipləri — float2, float3, float4 — GPU aparat registrlərinə xəritələnir.

Hesablama shaderləri (Compute Kernels)

Compute shader (kernel) — qrafik pipeline-ından kənarda yerinə yetirilən GPU funksiyasıdır. Kernel funksiyaları kvalifikatoru kernel ilə qeyd olunur və threadgroups-da təşkil olunmuş axınlarda (threads) icra olunur. Hesablama shaderləri şəkil emalı, fizika simulyasiyası, ML və post-emal üçün istifadə olunur.

cpp
// Şəkil bulanıqlaşdırma üçün 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 unikal axın indeksini ehtiva edir. Texture2D piksel növünə görə ixtisaslaşır: half (FP16), float (FP32). Compute kernels M4 Ultra-da 1 milyarddan çox axın grid ölçüsü ilə işə salına bilər. Apple Silicon GPU-da maksimum threadgroup ölçüsü 1024 axındır.

Performans və Metal Performance Shaders

Metal Performance Shaders (MPS) — Apple tərəfindən təmin edilən optimallaşdırılmış GPU funksiyaları kitabxanası. MPS konvolüsion neyron şəbəkələri (MPSNNConvolution), matris vurma (MPSMatrixMultiplication), çeşid (MPSParallelSort) və şəkil emalı (MPSImageGaussianBlur) daxildir. Bütün funksiyalar konkret Apple GPU-ları üçün optimallaşdırılıb.

MetalFX Upscaling

MetalFX — NVIDIA DLSS və AMD FSR rəqibi olan upscaling və hamarlaşdırma texnologiyası. MetalFX iki rejim tövsiyə edir: Spatial (FSR 2 alqoritmi ilə məkan upscalingi) və Temporal (hərəkət vektorları ilə zaman upscalingi). Temporal MetalFX 1440p renderdən yerli 4K-ya yaxın keyfiyyət təmin edir.

Apple (2025) məlumatlarına görə, MetalFX Temporal M4 Max-da oyunlarda görmə keyfiyyətini qoruyaraq yerli qətnamədən vizual olaraq fərqlənməyən performans artımını 3x-dək təmin edir. MetalFX Metal 3-ü dəstəkləyən istənilən GPU-da xüsusi tensor nüvələri olmadan işləyir. MetalFX-in layihəyə inteqrasiyası təxminən 50 sətir kod tələb edir.

Metal-ə şüa izləmə

Ray Tracing Metal 3-də M3, M4 və A17 Pro çiplərində aparat sürətləndirmə blokları (Ray Tracing Accelerators) ilə dəstəklənir. Metal BVH qurmaq üçün MTLAccelerationStructure və shaderlərdə şüa kəsişdirilməsi üçün MTLIntersectionFunction təmin edir. Milyonlarla üçbucaqlı nəhəng səhnələr milisaniyələr ərzində BVH-yə kompilyasiya olunur.

Apple (2025) məlumatlarına görə, M4 Ultra-da aparat şüa izləməsi saniyədə 40 milyard şüa kəsişdirilməsinə (Giga rays/s) qədər çatır. Bu, M1 Ultra-da proqram təminatı ilə şüa izləməsindən 4 dəfə sürətlidir. Metal RT kəsişdirilmə sorğularını, dinamik həndəsəni və realist animasiyalar üçün Motion Blur-u dəstəkləyir. Şüa izləməsi ilə əkslər və kölgələr real vaxtda 60 FPS-də işləyir.

Unified Memory və Zero-Copy

Unified Memory — CPU və GPU-nun ümumi fiziki yaddaşdan istifadə etdiyi Apple Silicon arxitekturası. Apple Silicon-da Metal CPU və GPU arasında məlumat kopyalamağı tələb etmir: shared rejimində MTLBuffer heç bir kopyalama olmadan hər iki prosessor üçün ələatandır. Bu, ənənəvi GPU-ların əsas darboğazını (PCIe ötürmələri) aradan qaldırır.

Metal-da Zero-Copy CPU-ya buferə məlumat yazmağa, GPU-nun isə onu gecikməsiz oxumağına imkan verir. Apple (2025) məlumatlarına görə, bu, oyunlarda və ML tapşırıqlarında diskret GPU-larla müqayisədə performansı 30–50% artırır. Diskret GPU-lar (Radeon ilə Mac Pro) üçün Metal yaddaş maneələri (memory barriers) vasitəsilə avtomatik sinxronizasiya ilə managed rejimini dəstəkləyir.

Tez-tez verilən suallar

Metal nədir və nə üçün lazımdır?

Metal — Apple-ın GPU ilə iş üçün aşağı səviyyəli API-si, minimal CPU yükü təmin edir. 3D qrafika, ML hesablamaları, şəkil emalı və simulyasiyalar üçün iOS, macOS və tvOS-da lazımdır. OpenGL və OpenCL-i əvəz edir.

Metal Vulkan-dan nə ilə fərqlənir?

Metal yalnız Apple cihazlarında işləyir, Unified Memory və Metal Performance Shaders ilə inteqrasiya olunub. Vulkan Windows, Android və Linux üçün platformalararası API-dir. Performans baxımından hər iki API müqayisə olunandır, lakin Metal Apple Silicon-da daha az yükə malikdir.

Metal şüa izləməsini dəstəkləyirmi?

Bəli, Metal 3-dən etibarən M3, M4 və A17 Pro çiplərində aparat şüa izləməsi mövcuddur. Metal MTLAccelerationStructure və shaderlərdə kəsişdirilmə sorğularını dəstəkləyir. Performans — M4 Ultra-da 40 Giga rays/s-dək.

MetalFX Upscaling nədir?

MetalFX — Apple-ın Spatial və Temporal rejimləri ilə upscaling texnologiyası. Tensor nüvələri olmadan Metal 3 ilə istənilən GPU-da işləyir. M4 Max-da yerli 4K-ya yaxın keyfiyyətlə 3x-dək performans artımı təmin edir.

Metal ilə işə başlamaq çətindirmi?

Aşağı səviyyəli resurs idarəetməsi səbəbindən giriş həddi SceneKit və ya Unity-dən yüksəkdir. Apple Metal Sample Code və developer.apple.com saytında dərslər təqdim edir. Əsas üçbucaq renderinqi üçün təxminən 200 sətir kod tələb olunur.

Nəticələr

  • Metal — minimal CPU yükü ilə aşağı səviyyəli Apple GPU API-si
  • MTLDeviceMTLCommandQueue — açıq resurs idarəetməsi ilə arxitekturanın əsası
  • MTLCommandBuffer və koderlər çoxaxınlı GPU əmr yazılmasını təmin edir
  • Metal Shading Language (C++14) vertex, fragment, compute və mesh-shaderləri dəstəkləyir
  • MetalFX — Metal 3 ilə istənilən GPU-da 3x-dək artımla upscaling
  • Apparat şüa izləməsi M3/M4/A17 Pro-da mövcuddur
  • Unified Memory Apple Silicon-da CPU və GPU arasında məlumat kopyalanmasını aradan qaldırır

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun