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 — API گرافیک و محاسبات سطح پایین از Apple
  • MTLDevice — چکیده‌سازی GPU که تمامی منابع Metal از طریق آن ایجاد می‌شوند
  • بافرهای دستور MTLCommandBuffer نوشتن چندرشته‌ای دستورات را فراهم می‌کنند
  • شییدرهای Metal Shading Language بر اساس C++14 به کد GPU ترجیمه می‌شوند
  • 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 را کنترل می‌کند که نسبت به OpenGL ES روی سخت‌افزار یکسان تا 50% افزایش عملکرد را به همراه دارد.

Metal تمامی تراشهای Apple را از A7 (2013) تا M4 Ultra (2025) پشتیبانی می‌کند. API مداوماً در حال تکامل است: Metal 3 (2022) پشتیبانی از mesh-shaderها و ردیابی پرتو را اضافه کرد، 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 را معرفی کرد — فناوری افزایش وضوح خود Apple برای بازی‌ها، رقیب 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 از طریق این شیء ایجاد می‌شوند: بافرها، بافت‌ها، کتبخانه‌های شییدر، pipelineها. در سیستم‌های چند GPU (مانند Mac Pro) می‌توان دستگاه مورد نظر را انتخاب کرد. روش supportsFamily: پشتیبانی از قابلیت‌ها را بررسی می‌کند: ردیابی پرتو، mesh-shaderها، 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 گیگابایت (در 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 یک تابع شییدر مشخص را نمایندگی می‌کند. شییدرهای رءس (vertex)، فرگمنت (fragment)، محاسباتی (kernel) و mesh-shaderها از طریق کتابخانه ایجاد می‌شوند. توابع در 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)، بارگذاری مجدد توابع، فضاهای نام و حساب آدرس پشتیبانی می‌کند. شییدرها توسط باکاند LLVM Apple به کد دودویی GPU ترجیمه می‌شوند.

شییدرهای رءس و فرگمنت

Vertex shader هر رأس را پردازش می‌کند: مختصات را از فضای جهان به فضای صفحه تبدیل می‌کند، نارمال‌ها را محاسبه می‌کند و داده‌ها را به شییدر فرگمنت ارسال می‌دهد. Fragment shader رنگ هر پیکسل را محاسبه می‌کند: بافت‌ها، روشنایی و افکت‌های پس از پردازش را اعمال می‌کند.

cpp
// شییدر رءس 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 می‌توانند با اندازه grid بیش از 1 میلیارد رشته در M4 Ultra اجرا شوند. حداکثر اندازه threadgroup در GPU Apple Silicon — 1024 رشته.

عملکرد و 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 کیفیت نزدیک به 4K طبیعی از رندر در 1440p ارائه می‌دهد.

به گزارش Apple (2025)، MetalFX Temporal روی M4 Max افزایش عملکرد تا 3x در بازی‌ها را با حفظ کیفیتی قابل تمایز نابودنی از وضوح طبیعی تامین می‌کند. MetalFX بر روی هر GPU دارای Metal 3 بدون هسته‌های تنسوری اختصاصی کار می‌کند. ادغام MetalFX در پروژه تقریباً 50 خط کد طول می‌کشد.

ردیابی پرتو در Metal

Ray Tracing در Metal 3 بر روی تراشهای M3، M4 و A17 Pro با بلوک‌های سرعت بخشی سخت‌افزاری (شتابدهنده‌های ردیابی پرتو) پشتیبانی می‌شود. Metal MTLAccelerationStructure را برای ساخت BVH و MTLIntersectionFunction را برای تقاطع پرتو در شییدرها فراهم می‌کند. صحنه‌های عظیم با میلیون‌ها مثلث در چند میلی‌ثانیه به BVH ترجیمه می‌شوند.

به گزارش Apple (2025)، ردیابی پرتو سخت‌افزاری روی M4 Ultra تا 40 میلیارد تقاطع پرتو در ثانیه (گیگارای در ثانیه) انجام می‌دهد. این 4 برابر سریع‌تر از ردیابی پرتو نرم‌افزاری روی M1 Ultra است. Metal RT از پرستارش‌های تقاطع، هندسه دینامیک و محو حرکت برای انیمیشن‌های واقع‌گرایانه پشتیبانی می‌کند. بازتاب‌ها و سایه‌ها با ردیابی پرتو در زمان واقعی با 60 FPS کار می‌کنند.

حافظه یکپارچه و 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 — API سطح پایین Apple برای کار با 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 حاشیه کمتری روی Apple Silicon دارد.

آیا Metal از ردیابی پرتو پشتیبانی می‌کند؟

بله، از Metal 3 به بعد بر روی تراشهای M3، M4 و A17 Pro ردیابی پرتو سخت‌افزاری قابل دسترس است. Metal MTLAccelerationStructure و پشتیبانی از intersection queries در شییدرها را فراهم می‌کند. عملکرد — تا 40 گیگارای در ثانیه روی M4 Ultra.

MetalFX Upscaling چیست؟

MetalFX — فناوری افزایش وضوح Apple با حالت‌های Spatial و Temporal. بدون هسته‌های تنسوری روی هر GPU با Metal 3 کار می‌کند. افزایش عملکرد تا 3x با کیفیت نزدیک به 4K طبیعی روی M4 Max.

آیا شروع کار با Metal سخت است؟

میزان دشواری ورود بیشتر از SceneKit یا Unity است به دلیل مدیریت منابع سطح پایین. Apple Metal Sample Code و آموزش‌هایی را در developer.apple.com ارائه می‌دهد. برای رندر پایه یک مثلث تقریباً 200 خط کد لازم است.

نتیجه‌گیری

  • Metal — API GPU سطح پایین 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 از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید