Vulkan — چیست، API چندسکویی و رندرینگ

نویسنده: IT Sectr منتشر شده: 2026-05-03 زمان مطالعه: 9 دقیقه

Vulkan — یک API چندسکویی برای کار با گرافیک و محاسبات روی GPU است که توسط کنسرسیوم Khronos Group توسعه یافته است. Vulkan کنترل سطح پایین بر سخت‌افزار، تولید فرمان‌های چندنخی و عملکرد قابل پیش‌بینی را فراهم می‌کند. طبق داده‌های Khronos Group (2026)، Vulkan روی 98% دستگاه‌های مدرن Android پشتیبانی می‌شود.

نکات اصلی

  • Vulkan — یک API چندسکویی GPU با کنترل سطح پایین بر سخت‌افزار
  • VkDevice و VkQueue ارسال چندنخی فرمان‌های GPU را فراهم می‌کنند
  • SPIR-V — فرمت باینری جهانی شیدرها که از GLSL و HLSL کامپایل می‌شود
  • Vulkan Memory Allocator تخصیص صریح حافظه GPU را مدیریت می‌کند
  • Vulkan Ray Tracing (VK_KHR_ray_tracing) ردیابی پرتو سخت‌افزاری را پشتیبانی می‌کند

Vulkan چیست؟

Vulkan — یک API سطح پایین و چندسکویی برای کار با پردازنده‌های گرافیکی است که اولین بار توسط Khronos Group در سال 2016 منتشر شد. Vulkan جایگزین OpenGL شد و سربار بسیار کمتر CPU، عملکرد قابل پیش‌بینی و امکان تولید فرمان‌های چندنخی را ارائه می‌دهد.

برخلاف OpenGL، که درایور بررسی‌ها و همگام‌سازی را روی CPU انجام می‌دهد، Vulkan مدیریت منابع را به توسعه‌دهنده واگذار می‌کند. تخصیص حافظه، همگام‌سازی از طریق سمافورها و مانع‌ها، ایجاد پایپ‌لاین‌ها — همه اینها به صورت صریح کنترل می‌شوند. این رویکرد در سناریوهای CPU-bound تا 50% افزایش عملکرد می‌دهد.

Vulkan روی Windows، Linux، Android، iOS (از طریق MoltenVK)، macOS (MoltenVK)، Nintendo Switch و کنسول‌ها پشتیبانی می‌شود. طبق داده‌های Khronos Group (2026)، API روی دستگاه‌هایی با GPU از NVIDIA، AMD، Intel، Qualcomm (Adreno)، ARM (Mali) و Apple (از طریق لایه Metal) کار می‌کند. Vulkan 1.4 (2026) پشتیبانی از Mesh Shaders و Video Encode API را اضافه کرد.

تاریخچه Vulkan

در ابتدا Vulkan با نام رمز «glNext» توسعه می‌یافت — جانشین OpenGL. Vulkan 1.0 (2016) API پایه با مدیریت صریح حافظه، شیدرهای SPIR-V و صف‌های چندنخی ارائه داد. Vulkan 1.1 (2018) Subgroup Operations و پشتیبانی از انواع 16 بیتی را اضافه کرد. Vulkan 1.2 (2020) Buffer Device Address و Timeline Semaphores را معرفی کرد.

Vulkan 1.3 (2022) Dynamic Rendering و Graphics Pipeline Library را استاندارد کرد. Vulkan 1.4 (2026) پشتیبانی از Mesh Shaders را اجباری کرد و Video Encode/Decode API برای کدگذاری سخت‌افزاری H.264/HEVC/AV1 اضافه کرد. طبق داده‌های Khronos (2026)، Vulkan 1.4 روی تمام GPUهای جدید NVIDIA RTX 50xx، AMD RX 9000 و Intel Arc سری B پشتیبانی می‌شود.

معماری Vulkan: دستگاه و صف‌ها

معماری Vulkan بر روی لایه انتزاع سخت‌افزار (HW layer) ساخته شده است. برنامه با دستگاه فیزیکی (VkPhysicalDevice) از طریق دستگاه منطقی (VkDevice) تعامل دارد. فرمان‌ها به صف‌ها (VkQueue) ارسال می‌شوند که هر کدام به خانواده خاصی از صف‌ها (graphics، compute، transfer) تعلق دارند.

VkInstance، VkDevice و VkQueue

VkInstance — شیء ریشه Vulkan که اطلاعاتی درباره لایه‌های اعتبارسنجی و افزونه‌ها ذخیره می‌کند. VkPhysicalDevice GPU فیزیکی را نمایش می‌دهد و امکان پرس و جوی ویژگی‌های آن، memory heaps و queue families را فراهم می‌کند. VkDevice — دستگاه منطقی با صف‌ها و افزونه‌های صریحاً درخواست شده.

cpp
// ایجاد دستگاه منطقی Vulkan
VkDeviceCreateInfo devInfo {};
devInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
devInfo.queueCreateInfoCount = 1;
 
float queuePriority = 1.0f;
VkDeviceQueueCreateInfo queueInfo {};
queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueInfo.queueFamilyIndex = 0;
queueInfo.queueCount = 1;
queueInfo.pQueuePriorities = &queuePriority;
devInfo.pQueueCreateInfos = &queueInfo;
 
VkDevice device;
vkCreateDevice(physicalDevice, &devInfo,
    nullptr, &device);
 
VkQueue queue;
vkGetDeviceQueue(device, 0, 0, &queue);

تابع vkCreateDevice یک دستگاه منطقی با صف‌های مشخص شده ایجاد می‌کند. VkQueue — توصیفگر صف برای ارسال فرمان‌ها. یک صف می‌تواند برای گرافیک، محاسبات و کپی استفاده شود، اگر پرچم‌های مربوطه توسط خانواده صف پشتیبانی شوند. اولویت صف (0.0–1.0) بر ترتیب اجرا در هنگام رقابت تأثیر می‌گذارد.

VkMemory و VkBuffer — مدیریت حافظه

در Vulkan حافظه به صورت صریح از طریق VkDeviceMemory تخصیص می‌یابد. توسعه‌دهنده از دستگاه فیزیکی memory types (HOST_VISIBLE، DEVICE_LOCAL) درخواست می‌کند و بلوک‌ها را تخصیص می‌دهد. بافرها (VkBuffer) و بافت‌ها (VkImage) حافظه اختصاصی ندارند — آنها به بلوک‌های تخصیص یافته از طریق vkBindBufferMemory متصل می‌شوند.

Vulkan Memory Allocator (VMA) — کتابخانه‌ای از AMD که مدیریت حافظه را ساده می‌کند. VMA به طور خودکار تخصیص‌های کوچک را در بلوک‌های بزرگ گروه‌بندی می‌کند، یکپارچه‌سازی را مدیریت می‌کند و memory type مناسب را انتخاب می‌کند. طبق داده‌های AMD (2025)، VMA تعداد تخصیص‌های حافظه را در مقایسه با مدیریت دستی 50–100 برابر کاهش می‌دهد.

VkCommandPool و VkCommandBuffer

VkCommandPool حافظه بافرهای فرمان را مدیریت می‌کند. بافرها (VkCommandBuffer) روی CPU نوشته می‌شوند و از طریق vkQueueSubmit به GPU ارسال می‌شوند. Vulkan از بافرهای primary و secondary پشتیبانی می‌کند: primary مستقیماً ارسال می‌شوند، secondary می‌توانند از primary برای ساخت چندنخی فرمان‌ها فراخوانی شوند.

نوشتن فرمان‌ها با vkBeginCommandBuffer شروع می‌شود و با vkEndCommandBuffer پایان می‌یابد. بین آنها فرمان‌های رندرینگ نوشته می‌شوند: vkCmdDraw، vkCmdDispatch، vkCmdCopyBuffer و vkCmdPipelineBarrier برای همگام‌سازی. برای هر فریم یک بافر فرمان جدید با reset کردن pool ایجاد می‌شود.

رندرینگ با Vulkan: پایپ‌لاین و فرمان‌ها

رندرینگ در Vulkan از طریق پایپ‌لاین‌ها (VkPipeline) سازماندهی می‌شود. برخلاف OpenGL، که در آن حالت پایپ‌لاین به صورت سراسری تغییر می‌کند، Vulkan از VkPipeline — یک پایپ‌لاین از پیش کامپایل شده استفاده می‌کند که تمام مراحل را شامل می‌شود: ورودی رأس، شیدرها، rasterization، depth-stencil و blending.

VkPipeline — پایپ‌لاین رندرینگ

VkGraphicsPipelineCreateInfo پایپ‌لاین کامل را توصیف می‌کند: شیدرهای رأس و قطعه، توپولوژی (triangle list، triangle strip)، rasterizer (fill mode، cull mode)، چندنمونه‌گیری (multisampling)، تست‌های depth-stencil، blending و تنظیمات viewport. Pipeline یک بار ایجاد و مجدداً استفاده می‌شود — تغییر حالت نیاز به pipeline جدید یا dynamic state دارد.

cpp
// پیکربندی پایپ‌لاین گرافیکی
VkGraphicsPipelineCreateInfo pipelineInfo {};
pipelineInfo.sType =
    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
pipelineInfo.stageCount = 2;
pipelineInfo.pStages = shaderStages;
pipelineInfo.pVertexInputState =&;
    vertexInputState;
pipelineInfo.pRasterizationState =&;
    rasterState;
 
VkPipeline graphicsPipeline;
vkCreateGraphicsPipelines(device,
    VK_NULL_HANDLE, 1, &pipelineInfo,
    nullptr, &graphicsPipeline);

Dynamic State (VK_DYNAMIC_STATE_VIEWPORT، VK_DYNAMIC_STATE_SCISSOR) امکان تغییر پارامترهای مشخص را بدون ایجاد pipeline جدید می‌دهد. Vulkan 1.4 پشتیبانی از Dynamic State 3 (VK_EXT_extended_dynamic_state_3) را برای مدیریت blend constants، depth bias و توپولوژی در حال اجرا اجباری کرد که تعداد pipelineها را در پروژه کاهش می‌دهد.

Render Pass و Dynamic Rendering

VkRenderPass ساختار گذرهای رندرینگ را توصیف می‌کند: کدام attachment استفاده می‌شود، چگونه پاک و بارگذاری می‌شوند. Dynamic Rendering (VK_KHR_dynamic_rendering، اجباری از Vulkan 1.4) فرآیند را ساده می‌کند: render pass در حال اجرا در بافر فرمان از طریق vkCmdBeginRendering ایجاد می‌شود، بدون شیء VkRenderPass از پیش تعریف شده.

طبق داده‌های Khronos (2026)، Dynamic Rendering مقدار کد مقداردهی Vulkan را 30–40% کاهش می‌دهد و تعداد ترکیبات pipeline را کاهش می‌دهد. برای تکنیک‌های رندرینگ با تأخیر پیچیده (Deferred Shading) همچنان استفاده از VkRenderPass کلاسیک با چندین subpass برای G-buffer و نورپردازی راحت است.

شیدرها در Vulkan: SPIR-V و GLSL

SPIR-V — فرمت باینری جهانی شیدرها در Vulkan است که توسط Khronos توسعه یافته است. شیدرها می‌توانند به GLSL، HLSL یا زبان Zink نوشته شوند و از طریق glslangValidator، dxc یا Google Shaderc به SPIR-V کامپایل شوند. Vulkan شیدرها را در کد منبع نمی‌پذیرد — فقط SPIR-V باینری.

GLSL در Vulkan

GLSL برای Vulkan با OpenGL GLSL استاندارد متفاوت است. از بلوک‌ها (layout) با تعیین صریح شماره‌های set و binding استفاده می‌شود، نه متغیرهای built-in. ویژگی‌های رأس از طریق location، uniformها از طریق uniform blocks یا بافرها تعیین می‌شوند. Push constants (تا 128 بایت) برای انتقال سریع داده بدون بافر در دسترس هستند.

glsl
// شیدر رأس Vulkan/GLSL
#version 460
 
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inNormal;
 
layout(binding = 0, set = 0)
uniform UniformBufferObject {
    mat4 modelViewProjection;
} ubo;
 
layout(location = 0) out vec3 outNormal;
 
void main() {
    gl_Position = ubo.modelViewProjection *
        vec4(inPosition, 1.0);
    outNormal = inNormal;
}

کیف‌کننده‌های layout(set = N, binding = M) — تفاوت کلیدی Vulkan GLSL با OpenGL. Set مربوط به مجموعه توصیفگرها (VkDescriptorSet)، binding مربوط به منبع خاص (بافر، بافت، نمونه‌بردار) است. تقسیم به set امکان تغییر کارآمد مجموعه منابع بین draw calls را بدون اتصال منابع جداگانه می‌دهد.

توصیفگرها و مجموعه‌های توصیفگر

VkDescriptorSet — گروهی از منابع (بافرها، بافت‌ها، نمونه‌بردارها) که به شیدرها متصل شده‌اند. layout توصیفگرها انواع منابع و شماره‌های binding آنها را توصیف می‌کند. مجموعه‌های توصیفگر از طریق vkUpdateDescriptorSets به‌روزرسانی و بین draw calls مجدداً استفاده می‌شوند. Vulkan 1.4 از VK_EXT_descriptor_buffer برای دسترسی مستقیم به توصیفگرها از GPU پشتیبانی می‌کند.

Push Constants — مکانیزم انتقال سریع داده‌های کم حجم (تا 128 بایت) به شیدرها بدون ایجاد توصیفگر. Push constants از طریق vkCmdPushConstants در بافر فرمان تعیین می‌شوند. طبق داده‌های Khronos (2025)، استفاده از push constants به جای uniform buffers سربار CPU را 10–15% در فرکانس draw calls بیش از 10 هزار در هر فریم کاهش می‌دهد.

Vulkan در پلتفرم‌های مختلف

Vulkan تنها API است که روی تمام پلتفرم‌های اصلی کار می‌کند: Windows (از طریق درایور رسمی ICD)، Linux (RADV، AMDVLK، NVIDIA)، Android (Vulkan 1.3+، اجباری از Android 10) و روی دستگاه‌های Apple از طریق MoltenVK — لایه ترجمه Vulkan → Metal.

Vulkan در Android

در Android، Vulkan برای Android 10 و بالاتر اجباری است. Google Vulkan را برای پروژه‌های جدید، به ویژه بازی‌های با عملکرد بالا و برنامه‌های AR از طریق ARCore توصیه می‌کند. Qualcomm Adreno و ARM Mali پشتیبانی کامل از Vulkan 1.3 با ردیابی پرتو سخت‌افزاری روی Adreno 8xx و Mali-G720 فراهم می‌کنند.

طبق داده‌های Google (2026)، 98% دستگاه‌های Android با Android 10+ از Vulkan پشتیبانی می‌کنند. برای سازگاری با نسخه‌های قدیمی، ANGLE (Almost Native Graphics Layer Engine) در دسترس است که OpenGL ES را به Vulkan ترجمه می‌کند. این امکان اجرای برنامه‌های قدیمی OpenGL را روی درایور Vulkan با افزایش عملکرد تا 20% فراهم می‌کند.

در Android، Vulkan اولویت بالایی برای بهره‌وری انرژی دارد: برنامه‌های Vulkan در مقایسه با OpenGL ES در بار گرافیکی یکسان روی دستگاه‌های با Adreno 7xx+ 25–40% انرژی کمتری مصرف می‌کنند. این Vulkan را به API ترجیحی برای بازی‌های روی دستگاه‌های موبایل تبدیل می‌کند.

Vulkan در Apple از طریق MoltenVK

MoltenVK — پیاده‌سازی Vulkan روی Metal است که توسط LunarG و Valve توسعه یافته است. MoltenVK فراخوانی‌های Vulkan API را به Metal ترجمه می‌کند و Vulkan 1.2 را در iOS و macOS پشتیبانی می‌کند. عملکرد MoltenVK نزدیک به Metal بومی است: سربار ترجمه بسته به سناریو 5–15% است.

طبق داده‌های LunarG (2025)، MoltenVK در CrossOver (Wine برای Mac) برای اجرای بازی‌های Windows در macOS استفاده می‌شود. Dota 2، Civilization VI و Baldur’s Gate 3 در macOS از طریق MoltenVK با عملکرد 30–60 FPS روی M3/M4 کار می‌کنند. MoltenVK از MetalFX upscaling برای بهبود عملکرد پشتیبانی می‌کند.

Vulkan Ray Tracing

VK_KHR_ray_tracing — افزونه ردیابی پرتو سخت‌افزاری در Vulkan، اجباری از Vulkan 1.4. روی GPUهای با هسته‌های RT پشتیبانی می‌شود: NVIDIA RTX 20xx/30xx/40xx/50xx، AMD RX 6000+/9000، Intel Arc A/B. Vulkan RT VkAccelerationStructure، VkRayTracingPipeline و Shader Binding Table را فراهم می‌کند.

Vulkan Ray Tracing از بازتاب‌ها، سایه‌ها، ambient occlusion و نورپردازی جهانی در زمان واقعی پشتیبانی می‌کند. طبق داده‌های Khronos (2026)، روی NVIDIA RTX 5090، Vulkan Ray Tracing تا 100 Giga rays/s در صحنه‌های با کیفیت مرجع اجرا می‌کند. برای پلتفرم‌های قابل حمل، Vulkan RT از طریق blur reduction و temporal denoising مقیاس‌پذیر است.

سوالات متداول

Vulkan چیست و چه تفاوتی با OpenGL دارد؟

Vulkan — یک API چندسکویی GPU سطح پایین با مدیریت صریح منابع. برخلاف OpenGL، کنترل بر حافظه، همگام‌سازی و چندنخی را فراهم می‌کند و افزایش عملکرد تا 50% در سناریوهای CPU-bound تضمین می‌کند.

Vulkan در چه پلتفرم‌هایی کار می‌کند؟

Vulkan روی Windows، Linux، Android، Nintendo Switch و در iOS/macOS از طریق MoltenVK (ترجمه به Metal) کار می‌کند. روی GPUهای NVIDIA، AMD، Intel، Qualcomm، ARM و Apple (از طریق MoltenVK) پشتیبانی می‌شود.

SPIR-V در Vulkan چیست؟

SPIR-V — فرمت باینری جهانی شیدرهای Vulkan. شیدرها به GLSL یا HLSL نوشته می‌شوند، به SPIR-V کامپایل و به Vulkan داده می‌شوند. این استقلال از زبان نوشتن شیدرها و عملکرد قابل پیش‌بینی کامپایل را تضمین می‌کند.

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

بله، از طریق VK_KHR_ray_tracing — افزونه اجباری از Vulkan 1.4. روی GPUهای با هسته‌های RT پشتیبانی می‌شود: NVIDIA RTX، AMD RX 6000+، Intel Arc. Vulkan RT شتاب ساختارهای BVH، Shader Binding Table و تقاطع‌های پرتو سخت‌افزاری را فراهم می‌کند.

آیا شروع استفاده از Vulkan دشوار است؟

آستانه ورود بالاتر از OpenGL یا DirectX 11 به دلیل مدیریت صریح حافظه، همگام‌سازی و پایپ‌لاین‌ها است. Khronos Vulkan Tutorial، Vulkan Samples و Vulkan Guide را ارائه می‌دهد. برای اولین مثلث حدود 500 خط کد نیاز است.

خلاصه

  • Vulkan — API چندسکویی سطح پایین GPU از Khronos Group
  • مدیریت صریح حافظه، همگام‌سازی و صف‌ها سربار CPU را کاهش می‌دهد
  • VkPipeline — پایپ‌لاین از پیش کامپایل شده برای گرافیک و محاسبات
  • SPIR-V — فرمت باینری شیدرها، کامپایل شده از GLSL و HLSL
  • Dynamic Rendering (Vulkan 1.4) ایجاد Render Pass را بدون VkRenderPass ساده می‌کند
  • MoltenVK کار Vulkan را در iOS و macOS از طریق Metal تضمین می‌کند
  • Vulkan 1.4 Mesh Shaders، Video Encode API و ردیابی پرتو اجباری را اضافه کرد

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

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

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