إرشادات تصميم Vulkan

يختلف Vulkan عن واجهات برمجة التطبيقات للرسومات السابقة في أنّ برامج التشغيل لا تُجري تحسينات معيّنة على التطبيقات، مثل إعادة استخدام مسار التعلّم. بدلاً من ذلك، يجب على التطبيقات التي تستخدم Vulkan تنفيذ هذه التحسينات بنفسها. وإذا لم يكن الأمر كذلك، قد تُظهر أداءً أسوأ من التطبيقات التي تُشغّل OpenGL ES.

وعندما تنفّذ التطبيقات هذه التحسينات بنفسها، يكون لديها القدرة على تنفيذ ذلك بشكل أكثر فعالية من أي برنامج تشغيل، نظرًا إلى أنّ بإمكانها الوصول إلى معلومات أكثر تحديدًا لحالة استخدام معيّنة. ونتيجة لذلك، فإن التحسين المهارة لتطبيق يستخدم Vulkan يمكن أن يؤدي إلى تحقيق أداء أفضل مما لو كان التطبيق يستخدم OpenGL ES.

تقدم هذه الصفحة العديد من التحسينات التي يمكن لتطبيق Android تنفيذها للحصول على إمكانات تعزيز الأداء من Vulkan.

تسريع الأجهزة

تتوافق معظم الأجهزة مع Vulkan 1.1 من خلال ميزة تسريع الأجهزة، فيما تتيح مجموعة فرعية صغيرة تشغيل هذا التحديث من خلال محاكاة البرامج. يمكن للتطبيقات رصد جهاز Vulkan مستند إلى برنامج باستخدام vkGetPhysicalDeviceProperties والتحقّق من الحقل deviceType في البنية التي تم إرجاعها. SwiftShader وعمليات التنفيذ الأخرى المستندة إلى وحدة المعالجة المركزية (CPU) تتضمّن القيمة VK_PHYSICAL_DEVICE_TYPE_CPU. يمكن للتطبيقات التحقّق تحديدًا من استخدام SwiftShader من خلال التحقّق من الحقلين vendorID وdeviceID اللذَين يستخدمان هذه البنية نفسها بحثًا عن قيم SwiftShader الخاصة.

على التطبيقات المهمة للأداء تجنُّب استخدام عمليات تنفيذ Vulkan التي تحاكي البرامج والعودة إلى OpenGL ES بدلاً من ذلك.

تطبيق دوران شاشة العرض أثناء العرض

عندما لا يتطابق الاتجاه المتجه للأعلى للتطبيق مع اتجاه عرض الجهاز، تقوم أداة التركيب بتدوير صور سلسلة تبديل التطبيق بحيث تتطابق. تُجري عملية التدوير هذه أثناء عرض الصور، ما يؤدي إلى استهلاك المزيد من الطاقة - أحيانًا أكثر بكثير مما لو لم يتم تدويرها.

وعلى النقيض من ذلك، يؤدي تدوير صور سلسلة التبديل أثناء إنشائها إلى استهلاك المزيد من الطاقة، إن وجد. يشير الحقل VkSurfaceCapabilitiesKHR::currentTransform إلى التدوير الذي ينطبق عليه التركيب على النافذة. بعد أن يطبّق التطبيق هذا التناوب أثناء العرض، يستخدم التطبيق الحقل VkSwapchainCreateInfoKHR::preTransform للإبلاغ عن اكتمال عملية التناوب.

تقليل عدد البطاقات التي يتم عرضها لكل لقطة

في معظم بُنى وحدات معالجة الرسومات على الأجهزة الجوّالة، تُعدّ عملية بدء بطاقة العرض وإنهائها عملية مكلّفة. يمكن لتطبيقك تحسين الأداء من خلال تنظيم عمليات العرض في أقل عدد ممكن من تمريرات العرض.

تقدم العمليات المختلفة لتحميل المرفقات وتخزين المرفقات مستويات مختلفة من الأداء. على سبيل المثال، إذا لم تكن بحاجة إلى الاحتفاظ بمحتوى مرفق، يمكنك استخدام VK_ATTACHMENT_LOAD_OP_CLEAR أو VK_ATTACHMENT_LOAD_OP_DONT_CARE الأسرع بكثير بدلاً من VK_ATTACHMENT_LOAD_OP_LOAD. وبالمثل، إذا لم تكن بحاجة إلى كتابة القيم النهائية للمرفق في الذاكرة لاستخدامها لاحقًا، يمكنك استخدام VK_ATTACHMENT_STORE_OP_DONT_CARE لتحقيق أداء أفضل بكثير من VK_ATTACHMENT_STORE_OP_STORE.

وفي معظم بطاقات العرض أيضًا، لا يحتاج تطبيقك إلى تحميل أو تخزين مرفق العمق/الاستنسل. وفي هذه الحالات، يمكنك تجنُّب تخصيص ذاكرة فعلية للمرفق باستخدام العلامة VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT عند إنشاء الصورة المُرفقة. يوفّر هذا البت المزايا نفسها التي يوفّرها "glFramebufferDiscard" في OpenGL ES.

اختيار أنواع الذكريات المناسبة

عند تخصيص ذاكرة الجهاز، يجب أن تختار التطبيقات نوع ذاكرة. يحدد نوع الذاكرة كيف يمكن للتطبيق استخدام الذاكرة، ويصف أيضًا خصائص التخزين المؤقت والترابط للذاكرة. تحتوي الأجهزة المختلفة على أنواع ذاكرة مختلفة وتختلف خصائص الأداء المختلفة باختلاف أنواع الذاكرة.

يمكن لأي تطبيق استخدام خوارزمية بسيطة لاختيار أفضل نوع ذاكرة لاستخدام معين. تختار هذه الخوارزمية النوع الأول من الذاكرة في مصفوفة VkPhysicalDeviceMemoryProperties::memoryTypes التي يفي بمعيارَين: يجب أن يكون نوع الذاكرة مسموحًا به للمخزن المؤقت أو الصورة، ويجب أن يتضمّن الحد الأدنى من الخصائص التي يتطلبها التطبيق.

لا تشتمل أنظمة الجوّال بشكل عام على أكوام ذاكرة مادية منفصلة لوحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات (GPU). في مثل هذه الأنظمة، لا يحظى VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT بالأهمية نفسها كما هو الحال في الأنظمة التي تتضمّن وحدات معالجة رسومات منفصلة مع ذاكرة مخصّصة لها. ويجب ألا يفترض التطبيق أن هذه السمة مطلوبة.

تجميع الواصف حسب معدّل التكرار

إذا كانت لديك عمليات ربط موارد تتغير بتردّدات مختلفة، استخدِم مجموعات واصفات متعددة لكل مسار بدلاً من إعادة ربط جميع الموارد لكل رسم. على سبيل المثال، يمكن أن يكون لديك مجموعة من أدوات الوصف لعمليات الربط حسب كل مشهد، ومجموعة أخرى للربط لكل مادة، ومجموعة ثالثة للربط لكل مثيل شبكة متداخلة.

استخدم الثوابت الفورية لتغييرات التكرار الأعلى، مثل التغييرات التي يتم تنفيذها مع كل طلب رسم.