تحسين Godot Engine Vulkan لنظام التشغيل Android

صورة تميمة Godot Engine

نظرة عامة

Godot Engine هو محرّك ألعاب رائج ومفتوح المصدر ومتوافق مع أنظمة التشغيل المتعددة، ويتوافق بشكلٍ جيد مع Android. يمكن استخدام Godot لإنشاء ألعاب من أي نوع تقريبًا، وهو قادر على إنشاء رسومات ثنائية وثلاثية الأبعاد. قدّم الإصدار 4 من Godot نظامًا جديدًا للعرض يتضمن ميزات متقدّمة لرسومات عالية الدقة. تم تصميم معالج رسومات Godot 4 لواجهات برمجة تطبيقات الرسومات الحديثة، مثل Vulkan.

تعاقدت مؤسسة Godot Foundation مع خبراء تحسين الرسومات في The Forge Interactive وتعاونت مع Google لتحليل محرك رسومات Vulkan في Godot 4 وتحسينه بشكلٍ أكبر، ثم دمج هذه التحسينات مرة أخرى في مستودع المحتوى الخاص بالمشروع. تساعد التحسينات المطوّرين في تحسين أدوات عرض Vulkan المخصّصة على Android.

منهجية التحسين ونتائجه

استخدَمت عملية التحسين مَشاهد ثلاثية الأبعاد مختلفة في Godot كمقاييس قياس الأداء أهداف. تم قياس وقت عرض المشاهد على أجهزة متعددة أثناء كل تكرار من عمليات التحسين. للتأهّل للعرض، يجب أن تُظهر التغييرات التي تم إجراؤها على المشغِّل تحسينات في الأداء على بعض الأجهزة التي تم اختبارها على الأقل، ولا يجوز أن تؤدي إلى تراجع الأداء على أي جهاز.

تم استخدام العديد من تصاميم وحدات معالجة الرسومات الشائعة في Android أثناء الاختبار. على الرغم من أنّ العديد من التحسينات أدّت إلى تحسينات عامة، كان لبعض التحسينات تأثير أكبر على بنية GPU معيّنة. أدّى مجموع كل أعمال التحسين إلى انخفاض عام في وقت عرض اللقطات على GPU بنسبة تتراوح بين %10 و% 20.

تحسين Vulkan العام

أجرى فريق Forge عملية إعادة هندسة عامة للبنية في الخلفية لميزة التوليد باستخدام تكنولوجيا Vulkan في Godot لتحسين الأداء ومساعدة الخلفية على التوسّع مع زيادة متطلبات التوليد للمحتوى. لا تقتصر التحسينات على الأجهزة المخصّصة للألعاب على الأجهزة المتحرّكة، بل تستفيد منها جميع منصات Godot Vulkan.

إتاحة الوحدات الإعلانية الديناميكية التي تتضمّن ميزة "إزاحة العنصر الإعلاني"

عند ربط مجموعة أوصاف تحتوي على عنصر ذاكرة تخزين منتظمة ديناميكية (UBO)، يسمح Vulkan بتحديد Offsets ديناميكية في UBO في مَعلمات الربط. يمكن استخدام هذه الميزة لحزم بيانات عمليات معالجة متعدّدة في وحدة تحكم واحدة في الذاكرة للعناصر، مع إعادة ربط مجموعة الأوصاف باستخدام كمية مختلفة من القيمة المتغيرة لاختيار البيانات المناسبة لمخطّط التظليل. تم تعديل أداة عرض Godot Vulkan للتمكّن من استخدام العناصر الديناميكية بدلاً من تهيئة العنصر إلى القيمة صفر دائمًا. يتيح هذا التحسين إجراء تحسينات مستقبلية على كفاءة الأداء.

مجموعات مجموعات الأوصاف للمحتوى المباشر غير القابل للتقديم أو الإيقاف

في السابق، كان السلوك التلقائي في أداة التقديم Godot Vulkan هو إنشاء جميع مجمعات مجموعات العناصر باستخدام العلامة VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT ، ما يعني أنّه يمكن إعادة تخصيص مجموعات العناصر إلى المجمع وإجراء عمليات إعادة تخصيص من المجمع. فرض هذا الوضع مزيدًا من التكلفة مقارنةً بحِزم مجموعات الأوصاف التي لا تسمح إلا بالتخصيص الخطي followed بإعادة ضبط الحزمة بالكامل.

يتمّ الآن إنشاء مجموعات مجموعات الأوصاف كمجموعات خطية بدون إعداد VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT، حيثما أمكن ذلك. بعد ذلك، تتم مجددًا إعادة ضبط المجموعات المجمّعة للمحتوى المجدوَل بالكامل عند الحاجة. يتضمّن هذا العمل أيضًا تحسينًا إضافيًا لمحاولة ربط مجموعة الأوصاف المجمّعة كلما أمكن ذلك، ما يقلل من عدد طلبات الاستدعاء المنفصلة إلى vkCmdBindDescriptorSets().

دعم أداة أخذ العينات غير القابلة للتغيير

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

توفّر أدوات أخذ العينات غير القابلة للتغيير مرونة أكبر من خلال عدم الحاجة إلى إدارة وربط عناصر أدوات أخذ العينات المفصّلة. تم تعديل أداة التقديم Godot Vulkan للسماح باستخدام أدوات جمع العينات غير القابلة للتغيير، وتم تغيير استخدام أدوات جمع العينات لاستخدام أدوات جمع العينات غير القابلة للتغيير كلما أمكن ذلك.

التحسين المخصّص للأجهزة الجوّالة

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

تشمل التحسينات ما يلي:

  • استبدال استخدام الثوابت الكبيرة للدفع
  • تخصيص ذاكرة التخزين المؤقت بشكل كسول
  • إتاحة المخزن المؤقت الدائم
  • تغيير وضع فك ترميز ASTC
  • تدوير الشاشة مسبقًا

استبدال استخدام الثوابت الكبيرة للدفع

"الثوابت التي يتم دفعها" هي ميزة تسمح بإدخال قيم ثابتة لبرنامج shader النشط في ذاكرة التخزين المؤقت للطلبات. إنّ الثوابت التي يتمّ دفعها مفيدة لأنّها لا تتطلّب إنشاء ذاكرة تخزين مؤقت وملؤها ولا تكون مرتبطة بالواصفِين. ومع ذلك، فإنّ الثابتة المُرسَلة لها حجم أقصى محدود ويمكن أن تؤثر سلبًا في الأداء على الأجهزة الجوّالة.

أثناء الاختبار على أجهزة Android، تم تحسين الأداء من خلال استبدال استخدام الدفع المستمر لـ أكثر من 16 بايت باستخدام مخازن ذاكرة مؤقتة موحّدة. كانت Shaders التي استخدمت 16 بايت أو أقل من data الثابتة تحقّق أداءً أفضل باستخدام push constants. بالإضافة إلى مراعاة الأداء، تفرض بعض أجهزة الرسومات الحد الأدنى من المحاذاة على 64 بايت لملف التخزين المؤقت الموحد، ما يقلل من كفاءة الذاكرة بسبب الحشو غير المستخدَم مقارنةً باستخدام الثوابت التي يتم دفعها.

تخصيص ذاكرة التخزين المؤقت بشكل كسول

تستخدم معظم أجهزة الرسومات الجوّالة بنية التقديم المُؤجَّل المستند إلى الوحدات (TBDR). تقسم وحدات معالجة الرسومات التي تستخدم تقنية TBDR منطقة الشاشة الأكبر إلى شبكة من مربّعات أصغر وتُعرِض كل مربّع على حدة. يتم الاحتفاظ بكل مربّع من خلال كمية صغيرة من ذاكرة الوصول العشوائي (RAM) عالية السرعة التي تستخدمها وحدة معالجة الرسومات لتخزين المربّع. باستخدام TBDR، يمكن أن تظل أهداف العرض التي لا يتم أخذ عيّنات منها أبدًا من خلال هدف آخر خارج مسار العرض بالكامل في ذاكرة الوصول العشوائي للوحدة المربّعة ولا تتطلّب ذاكرة تخزين مؤقتة لتخزين احتياطي في الذاكرة الرئيسية.

تمت إضافة VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT أثناء إنشاء استهدافات العرض المناسبة، مثل استهدافات اللون العميق واللون الرئيسي، لتجنُّب تخصيص ذاكرة مخزن مؤقت لن يتم استخدامها مطلقًا. تم قياس توفير الذاكرة في ميزة "تحديد الذاكرة بشكلٍ غير نشط" في عيّنات المشاهد ليصل إلى 50 ميغابايت تقريبًا من ذاكرة الوصول العشوائي.

إتاحة المخزن المؤقت الدائم

تستخدم الأجهزة الجوّالة بنية الذاكرة الموحدة (UMA) بدلاً من التمييز بين ذاكرة الوصول العشوائي (RAM) الرئيسية وذاكرة الوصول العشوائي للرسومات. عندما تكون ذاكرة الوصول العشوائي (RAM) الرئيسية وذاكرة الوصول العشوائي (RAM) لوحدة الرسومات منفصلتَين، يجب نقل البيانات من ذاكرة الوصول العشوائي (RAM) الرئيسية إلى ذاكرة الوصول العشوائي (RAM) لوحدة الرسومات لكي يتم استخدامها من قِبل وحدة معالجة الرسومات. ينفّذ Godot عملية النقل هذه في عارض Vulkan من خلال استخدام وحدات التخزين المؤقت. في أجهزة UMA، لن يكون ملف التخزين المؤقت لعمليات النقل ضروريًا لأنواع كثيرة من البيانات، إذ يمكن استخدام الذاكرة من قِبل كلّ من وحدة المعالجة المركزية ووحدة معالجة الرسومات. وفّرت أداة Forge إمكانية استخدام ذاكرة التخزين المؤقت المشتركة الدائمة على الأجهزة المتوافقة للتوقّف عن استخدام وضع التقديم كلما أمكن ذلك.

صور لمشهد godot تعرض معلومات التحليل مع
        بدون تفعيل المخازن المؤقتة الثابتة
الشكل 1. تحليل الاختلافات بين ملفّات التخزين المؤقت الدائمة التي تم تفعيلها أو إيقافها في مشهد نموذجي

تغيير وضع فك ترميز ASTC

تنسيق ضغط البنية التكيُّفي القابل للتوسيع (ASTC) هو التنسيق المفضّل لضغط البنية الحديث على الأجهزة الجوّالة. أثناء فك الضغط، قد تفكّ وحدة معالجة الرسومات تلقائيًا الترميز من وحدات البكسل الصغيرة إلى قيمة وسيطة ذات دقة أكبر مما هو مطلوب للحفاظ على الدقّة المرئية، ما يؤدي إلى فقدان كفاءة النسيج. إذا كان الجهاز المستهدَف يتوافق مع الامتداد VK_EXT_astc_decode_mode، يتم استخدامه لتحديد قيم غير عادية بسعة 8 بت لكل مكوّن عند معالجة الترميز بدلاً من قيم النقطة العائمة بسعة 16 بت.

تدوير الشاشة مسبقًا

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

تحسينات على تصحيح الأخطاء

بالإضافة إلى إجراء تحسينات على الأداء، حسّنت أداة The Forge تجربة تصحيح أخطاء مشاكل الرسومات في أداة عرض Godot من خلال التحسينات التالية:

  • تمديد فترة توفُّر الجهاز
  • أشرطة التنقل
  • علامات تصحيح الأخطاء

تمديد فترة توفُّر الجهاز

عندما تواجه وحدة معالجة الرسومات مشكلة أثناء عمليات التقديم، يمكن لبرنامج تشغيل Vulkan عرض نتيجة VK_ERROR_DEVICE_LOST من طلب واجهة برمجة التطبيقات Vulkan API. بشكلٍ تلقائي، لا يتم تقديم أي معلومات إضافية عن السياق الذي أدّى إلى إرجاع السائق قيمة VK_ERROR_DEVICE_LOST. توفّر إضافة VK_EXT_device_fault آلية للسائق لتقديم معلومات إضافية عن طبيعة الخطأ. أضافت Godot إمكانية تفعيل إضافة خطأ الجهاز (إذا كان ذلك متاحًا) وإعداد تقارير عن المعلومات التي يعرضها برنامج تشغيل الجهاز.

قد يكون من الصعب تصحيح أخطاء تعطُّل وحدة معالجة الرسومات أو توقُّف التنفيذ. للمساعدة في تحديد المحتوى الرسومي الذي ربما تم عرضه في وقت حدوث خطأ، تمت إضافة دعم شريط التنقّل إلى أداة عرض Godot. "الخيط السلكي" هو قيم يحدّدها المستخدم ويمكن إرفاقها بالمحتوى في قوائم الرسم في الرسم البياني للعرض. تتم كتابة بيانات مسار التنقّل قبل بدء عملية عرض جديدة. في حال حدوث تعذّر في التنفيذ أو تعطُّل، يمكن استخدام قيمة مسار التنقّل الحالي لتحديد البيانات التي قد تكون قد أدّت إلى حدوث المشكلة.

علامات تصحيح الأخطاء

تُستخدَم علامات تصحيح الأخطاء، عندما يكون ذلك مسموحًا به من قِبل برنامج التشغيل، لتسمية الموارد. يتيح ذلك ربط سلاسل يمكن للمستخدم قراءتها بعمليات مثل عمليات التقديم والموارد مثل المخازن المؤقتة والنسيج عند استخدام أداة رسومات مثل RenderDoc. تمت إضافة ميزة التعليق التوضيحي لعلامة تصحيح الأخطاء إلى أداة عرض Godot Vulkan.

مدوّنة Godot Engine: آخر الأخبار حول التعاون مع Google وThe Forge

طلب سحب تعاون بشأن Vulkan في Godot Engine