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 را کنترل میکند که نسبت به 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 (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 بر مبنای مفهوم مدیریت صریح ساخته شده: توسعهدهنده اشیای MTLDevice (دستگاه)، MTLBuffer (بافرهای داده)، MTLTexture (بافتها) و MTLCommandQueue (صف دستور) را ایجاد میکند. بر خلاف OpenGL، که وضعیت در زمینه ذخیره میشود، Metal از اشیای وضعیت (state objects) استفاده میکند که پیش از موقع ترجیمه میشوند.
MTLDevice نماینده GPU فیزیکی یا مجازی است. تمامی منابع Metal از طریق این شیء ایجاد میشوند: بافرها، بافتها، کتبخانههای شییدر، pipelineها. در سیستمهای چند GPU (مانند Mac Pro) میتوان دستگاه مورد نظر را انتخاب کرد. روش supportsFamily: پشتیبانی از قابلیتها را بررسی میکند: ردیابی پرتو، mesh-shaderها، 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 گیگابایت (در 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 یک تابع شییدر مشخص را نمایندگی میکند. شییدرهای رءس (vertex)، فرگمنت (fragment)، محاسباتی (kernel) و mesh-shaderها از طریق کتابخانه ایجاد میشوند. توابع در 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)، بارگذاری مجدد توابع، فضاهای نام و حساب آدرس پشتیبانی میکند. شییدرها توسط باکاند LLVM Apple به کد دودویی GPU ترجیمه میشوند.
Vertex shader هر رأس را پردازش میکند: مختصات را از فضای جهان به فضای صفحه تبدیل میکند، نارمالها را محاسبه میکند و دادهها را به شییدر فرگمنت ارسال میدهد. Fragment shader رنگ هر پیکسل را محاسبه میکند: بافتها، روشنایی و افکتهای پس از پردازش را اعمال میکند.
// شییدر رءس 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 کیفیت نزدیک به 4K طبیعی از رندر در 1440p ارائه میدهد.
به گزارش Apple (2025)، MetalFX Temporal روی M4 Max افزایش عملکرد تا 3x در بازیها را با حفظ کیفیتی قابل تمایز نابودنی از وضوح طبیعی تامین میکند. MetalFX بر روی هر GPU دارای Metal 3 بدون هستههای تنسوری اختصاصی کار میکند. ادغام MetalFX در پروژه تقریباً 50 خط کد طول میکشد.
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 کار میکنند.
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 — API سطح پایین Apple برای کار با GPU با حاشیه های مینیمم CPU. برای گرافیک 3D، محاسبات ML، پردازش تصویر و شبیهسازی در iOS، macOS و tvOS مورد استفاده قرار میگیرد. جایگزین OpenGL و OpenCL.
Metal فقط روی دستگاههای Apple کار میکند و با Unified Memory و Metal Performance Shaders یکپارچه شده. Vulkan یک API چند سیستمی برای Windows، Android و Linux است. از نظر عملکرد، هر دو API قابل مقایسه هستند، اما Metal حاشیه کمتری روی Apple Silicon دارد.
بله، از Metal 3 به بعد بر روی تراشهای M3، M4 و A17 Pro ردیابی پرتو سختافزاری قابل دسترس است. Metal MTLAccelerationStructure و پشتیبانی از intersection queries در شییدرها را فراهم میکند. عملکرد — تا 40 گیگارای در ثانیه روی M4 Ultra.
MetalFX — فناوری افزایش وضوح Apple با حالتهای Spatial و Temporal. بدون هستههای تنسوری روی هر GPU با Metal 3 کار میکند. افزایش عملکرد تا 3x با کیفیت نزدیک به 4K طبیعی روی M4 Max.
میزان دشواری ورود بیشتر از SceneKit یا Unity است به دلیل مدیریت منابع سطح پایین. Apple Metal Sample Code و آموزشهایی را در developer.apple.com ارائه میدهد. برای رندر پایه یک مثلث تقریباً 200 خط کد لازم است.
نتیجهگیری
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.