يوضّح لك هذا المستند كيفية تحسين أداء اللعبة باستخدام أدوات لتحديد المشاكل التي تؤثر سلبًا في أداء وحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات (GPU) وحلّها.
تحسين أداء وحدة المعالجة المركزية
إذا أظهر التحليل أنّ اللعبة تعتمد على وحدة المعالجة المركزية، من الضروري إجراء المزيد من التحقيق. ويتطلّب ذلك تحديد سلاسل المحادثات أو واجهات برمجة التطبيقات المحدّدة التي تتسبّب في حدوث اختناقات وتقليل عدد اللقطات في الثانية.
بالنسبة إلى تحسين وحدة المعالجة المركزية، لا يكون الحلّ الشامل فعّالاً بشكل عام. بدلاً من ذلك، عليك تحديد عبء العمل الأكثر تطلّبًا استنادًا إلى اللعبة أو المشهد، ثم تحسين المنطق والوظائف ذات الصلة.
أدوات تتبُّع توقيت محرّك اللعبة
يمكن أن تساعد الأدوات التالية في إجراء هذا التحليل:
إحصاءات Unreal
في مشاريع Unreal Engine، تسهّل أداة Unreal Insight Tool تحليل معلومات تتبُّع التوقيت الخاصة بكل سلسلة فرعية تتضمّن إطارًا.
على سبيل المثال، يستخدم GameThread عادةً أكبر نسبة من وقت وحدة المعالجة المركزية، ويرجع ذلك بشكل أساسي إلى Tick Time. بالإضافة إلى ذلك، يتم استهلاك جزء كبير من وقت Tick Time في المهام المرتبطة بـ FActorComponentTickFunction.
لتحسين FActorComponentTick، من الضروري استبعاد العمليات الحسابية وتنفيذ عملية الحذف للشخصيات والعناصر الموضوعة خارج مجال رؤية الكاميرا. بالإضافة إلى ذلك، يمكن أن يؤدي استخدام الصور المتحركة المستندة إلى مستوى التفاصيل إلى تحسين الأداء بشكل أكبر.
Unity Profiler (Unity)
يكشف التحليل باستخدام Unity Profiler أنّ سلسلة التعليمات الرئيسية تستهلك أكثر من 45 ملي ثانية، حيث تستغرق PostLateUpdate.FinishFrameRendering 16.23 ملي ثانية، ما يجعلها العملية الأكثر استهلاكًا للوقت. ضمن هذا الإطار، تم رصد عمليات استدعاء متعددة للدالة Inl_RenderCameraStack. ننصحك بالتأكّد من ضرورة تفعيل الكاميرات وتحسينها وفقًا لذلك.
أدوات إنشاء الملفات الشخصية على مستوى النظام
استخدِم أدوات إنشاء الملفات الشخصية التالية:
Perfetto
باستخدام أداة Perfetto لتتبُّع الأداء، يمكنك تحديد مهام وحدة المعالجة المركزية (CPU) وتفاصيل التنفيذ لكل سلسلة محادثات على جهاز يعمل بنظام التشغيل Android. يتيح لك ذلك تحديد المؤثّرات السلبية في الأداء من خلال تحليل بيانات تنفيذ سلسلة التعليمات البرمجية.
حالة الحمل الزائد لوحدة المعالجة المركزية
يشير التتبُّع إلى أنّ عبء العمل على GameThread وRenderThread يتسبّب في حدوث تأخيرات في QueuePresent في RHI Thread، ما يؤدي إلى سيناريو مرتبط بوحدة المعالجة المركزية (CPU)، استنادًا إلى VSync.
حالة الحمل الزائد لوحدة معالجة الرسومات
يشير التتبُّع إلى أنّ عملية إكمال وحدة معالجة الرسومات نفسها تتجاوز 25 ملي ثانية، ما يشير إلى سيناريو مرتبط بوحدة معالجة الرسومات.
Simpleperf
لتحديد الدوال التي تستخدم وحدة المعالجة المركزية بأعلى معدّل حالي، يمكن استخدام أداة simpleperf. للحصول على أفضل النتائج، يُنصح بترتيب هذه الوظائف حسب الأولوية ومعالجة الوظائف الأكثر استخدامًا أولاً.
تساعدك أداة Simpleperf في فحص البيانات حول الدوال التي تستخدم معظم وقت وحدة المعالجة المركزية. لتحسين استخدام وحدة المعالجة المركزية، ابدأ بالدوال التي تستخدم أكبر قدر من وحدة المعالجة المركزية. في هذا المثال، تستخدم العملية USkeletalMeshComponent، المرتبطة بالصورة المتحركة في ActorComponentTickFunctions، معظم وحدة المعالجة المركزية.
تحسين وحدة معالجة الرسومات
إذا أظهر التحليل أنّ اللعبة تعتمد على وحدة معالجة الرسومات، من الضروري إجراء المزيد من التحقيق. ويتطلّب ذلك استخدام أدوات وأساليب مختلفة لتحسين أداء وحدة معالجة الرسومات وتحليلها.
لتحسين وحدة معالجة الرسومات، استخدِم برنامج تصحيح أخطاء الإطارات من أجل تحليل مسار العرض وطلبات الرسم لكل مشهد. عليك أيضًا فهم بنية وحدة معالجة الرسومات وسلوك خطوط نقل البيانات بشكل كامل لتحديد العمليات غير الضرورية أو المجالات التي يمكن تحسينها.
توضّح الأقسام التالية طرقًا وأدوات لتحسين أداء وحدة معالجة الرسومات.
إزالة RenderPasses غير الضرورية
لتحسين أداء العرض وتقليل حجم المعالجة التي تتحملها وحدة معالجة الرسومات، عليك إزالة عمليات العرض غير الضرورية. ويشمل ذلك أي عملية عرض لا تتضمّن طلبات رسم أو لم يتم استخدام ناتجها في الإطار النهائي.
استخدِم برنامج تصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc، لتحليل مسار العرض وتحديد فرص التحسين.
عدم توفّر طلبات رسم: تحقَّق مما إذا كان تمرير العرض يتضمّن أي طلبات رسم. إذا لم يكن يتضمّن طلبات رسم، أزِل البطاقة.
الناتج غير المستخدَم: تحقَّق مما إذا كانت عمليات التمرير اللاحقة تصل إلى نواتج عملية العرض أو تعرضها، مثل اللون أو العمق. إذا لم يكن كذلك، أزِل البطاقة.
البطاقات القابلة للدمج: حدِّد البطاقات التي يمكنك دمجها:
- إطار المخزن المؤقت أو المرفقات نفسها
- عمليات التحميل أو التخزين المتوافقة
- ما مِن حواجز اعتمادية بينهما
تقليل عمليات التحميل أو التخزين
تتطلّب عمليات التحميل أو التخزين الكثير من الموارد لأنّها تستخدم قدرًا كبيرًا من الذاكرة.
تقليل عمليات التحميل والتخزين غير الضرورية نفِّذ هذه الإجراءات فقط عندما تكون المرفقات داخل RenderPass مطلوبة. في ما عدا ذلك، استبدِلها بعمليات Clear أو Don't care لتقليل الحمل الزائد.
كيفية تحسين الأداء
استخدِم أداة لتصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc، لتحليل مسار العرض وتحديد فرص التحسين التالية:
التحميل: إذا كان المرفق الخاص بتمرير العرض لا يستخدم بيانات من تمرير أو مرفق سابق، لن تكون عملية التحميل ضرورية. في مثل هذه الحالات، يمكن أن يؤدي استخدام
Don't careأوClearإلى تقليل النفقات العامة.التخزين: إذا لم يتم استخدام مرفق تمرير العرض بعد تمرير العرض الحالي، لن تكون عملية التخزين ضرورية. في مثل هذه الحالات، استخدِم إما
Don't careأوClear.استبدال: تحديد ما إذا كان يمكن استبدال إعدادات التحميل أو التخزين الحالية بـ
ClearأوDon't Careبدون التأثير في الإطار النهائي.
تجنُّب تجاهل البكسل لتفعيل Early-Z
تعمل تقنية Early-Z على تحسين الأداء على المنصات المتوافقة مع الأجهزة الجوّالة. ومع ذلك، يؤدي تضمين discard تعليمات ضمن أداة تظليل إلى إيقاف Early-Z تلقائيًا. إذا لم تكن discard
التعليمات ضرورية، أزِلها.
تسريع Early-Z
يقلّل هذا التحسين بشكل كبير من عمليات تظليل الأجزاء ويحسّن أداء وحدة معالجة الرسومات.
Early-Z اختبار العمق والاستنسل
كيفية تحسين الأداء
استخدِم أداة لتصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc، لتحليل مسار العرض وتحديد فرص التحسين التالية:
استخدام
discardفي أدوات تظليل الأجزاء: تمنع الكلمة الرئيسيةdiscardوحدة معالجة الرسومات من إجراء اختبارات العمق المبكرة لأنّه لا يمكن معرفة مدى ظهور الجزء مسبقًا.تعديل
gl_FragDepth: يؤدي تعديلgl_FragDepthبشكل ديناميكي إلى تغيير عمق جزء من الصورة، ما يؤدي إلى إيقاف تحسين Early-Z لأنّ العمق النهائي غير معروف قبل معالجة الجزء.تفعيل ميزة "الشفافية إلى التغطية": عند تفعيل ميزة "الشفافية إلى التغطية" (التي يتم استخدامها غالبًا في عرض MSAA)، تعتمد تغطية الأجزاء على قيم الشفافية. ويمكن أن يؤدي ذلك إلى تأخير اختبار العمق وإيقاف ميزة Early-Z.
تحسين تنسيق النسيج
يؤدي اختيار تنسيق النسيج الأمثل إلى تقليل استهلاك الذاكرة وتحسين كفاءة النطاق الترددي وتحسين أداء العرض. قد يؤدي استخدام تنسيقات عالية الدقة بشكل مفرط إلى إهدار موارد وحدة معالجة الرسومات بدون تقديم مزايا مرئية.
كيفية تحسين الأداء
استخدِم أداة لتصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc، لتحليل مسار العرض وتحديد فرص التحسين التالية:
- استخدام
D24S8بدلاً منD32S8لمخازن مؤقتة للعمق والاستنسل: يؤدي استخدامD24S8لمخازن مؤقتة للعمق والاستنسل إلى تقليل استهلاك الذاكرة بنسبة% 20 مقارنةً بـD32S8، مع عدم وجود فرق ملحوظ في الجودة المرئية في معظم التطبيقات. - استخدام ضغط
ASTCلزخارف الألوان: يقلّل ضغطASTCبشكل كبير من استخدام ذاكرة الزخرفة، وذلك بمقدار يصل إلى 8 مرات مقارنةً بالتنسيقات غير المضغوطة، مع الحفاظ على جودة مرئية عالية. - استخدام تنسيقات نصف عائمة بدلاً من التنسيقات العائمة الكاملة: استخدِم
R16FأوRG16Fلتقليل معدل نقل البيانات في الذاكرة واستهلاك مساحة التخزين. هذه التنسيقات مناسبة تمامًا لمخازن مؤقتة للمعالجة اللاحقة.
تحسين تعقيد الأشكال الهندسية
يؤدي تقليل التعقيد الهندسي إلى تحسين أداء العرض، خاصةً على الأجهزة الجوّالة التي تتضمّن إمكانات محدودة لوحدة معالجة الرسومات. ويشمل ذلك استخدام عدد أقل من الرؤوس والمثلثات، ودمج العناصر لتقليل طلبات الرسم، وإزالة الأشكال الهندسية غير المعروضة أو غير الضرورية. يمكن أن تقلّل تقنيات مثل تبسيط الشبكة ومستوى التفاصيل (LOD) وإزالة الأجزاء غير المرئية بشكل كبير من حجم المعالجة الخاصة بالعرض التي تتحملها وحدة معالجة الرسومات، كما يمكن أن تزيد من عدد اللقطات في الثانية.
كيفية تحسين الأداء
استخدِم أدوات إنشاء الملفات الشخصية وأدوات تصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc أو Android GPU Inspector أو أدوات تحليل الأداء الأخرى، لتحديد المشاكل المتعلقة بالهندسة والتي تؤدي إلى بطء الأداء.
تقليل عدد المضلّعات: قلِّل من استخدام المضلّعات، خاصةً للأجسام الصغيرة أو البعيدة.
استخدام مستوى التفاصيل (LOD): استنادًا إلى مسافة الكاميرا، يتم تلقائيًا استخدام شبكات أبسط.
دمج الشبكات الصغيرة (Merge Small Meshes): يمكنك دمج العناصر الثابتة لتقليل طلبات الرسم والعبء الزائد على وحدة المعالجة المركزية.
الاستبعاد حسب المخروط الناقص والحجب: تجنَّب عرض الكائنات التي تقع خارج نطاق العرض أو التي تحجبها عناصر أخرى.
إزالة المرفقات غير الضرورية
تستهلك مرفقات تمرير العرض (مثل اللون والعمق والاستنسل) نطاقًا تردديًا للذاكرة وموارد وحدة معالجة الرسومات، حتى إذا لم يتم استخدامها. تؤدي إزالة المرفقات غير الضرورية أو المكرّرة إلى تحسين الأداء وتقليل استهلاك الطاقة، خاصةً على المنصات المتوافقة مع الأجهزة الجوّالة.
كيفية تحسين الأداء
استخدِم أدوات إنشاء الملفات الشخصية وأدوات تصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc أو Android GPU Inspector أو أدوات تحليل الأداء الأخرى، لتحديد المشاكل المتعلقة بأداء الأشكال الهندسية.
- التحقّق من الاستخدام الفعلي: هل هناك أي طلبات رسم أو برامج تظليل تكتب في المرفق أو تقرأ منه؟
- تحليل ناتج الإطار: استخدِم
RenderDocأو أدوات مشابهة لتحديد ما إذا كان المرفق يساهم في الصورة النهائية. - استخدام المرفقات المؤقتة أو الوهمية: يجب استخدام المرفقات المؤقتة أو عملية تخزين "لا يهم" للبيانات المؤقتة التي لا تتطلب تخزينًا دائمًا.
تحسين دقة التظليل
يؤدي استخدام دقة عالية جدًا (على سبيل المثال، highp بدلاً من mediump أو lowp) في برامج التظليل إلى زيادة حجم المعالجة على وحدة معالجة الرسومات واستهلاك الطاقة والضغط على السجل، خاصةً على وحدات معالجة الرسومات الخاصة بالأجهزة الجوّالة. باستخدام أقل دقة مناسبة للمتغيرات (مثل المواضع والألوان والأشعة فوق البنفسجية)، يمكنك تحسين الأداء بدون تأثير مرئي ملحوظ.
كيفية تحسين الأداء
استخدِم أدوات إنشاء الملفات الشخصية وأدوات تصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc أو Android GPU Inspector أو أدوات تحليل الأداء الأخرى، لتحديد المشاكل المتعلقة بالهندسة التي تؤدي إلى بطء الأداء.
مراجعة رمز أداة التظليل: قيِّم متغيّرات أداة التظليل وتأكَّد من استخدام الدقة العالية عند الضرورة فقط، مثل عمليات حساب العمق أو المساحة على الشاشة. استخدِم دقة متوسطة أو منخفضة للألوان أو إحداثيات الأشعة فوق البنفسجية أو القيم التي لا تتطلّب دقة عالية.
استخدام أدوات تصحيح أخطاء وحدة معالجة الرسومات: يمكن لأدوات التشخيص، مثل RenderDoc أو أدوات تحليل أداء وحدات معالجة الرسومات على الأجهزة الجوّالة (مثل AGI أو Mali/GPU Inspector)، تحديد الاستخدام المرتفع للسجلّات أو توقّف أدوات التظليل المرتبط بمشاكل الدقة.
تفعيل ميزة "إخفاء الوجوه الخلفية"
غالبًا ما يكون عرض المثلثات التي لا تواجه الكاميرا (الأسطح الخلفية) غير ضروري للأجسام الصلبة.
كيفية تحسين الأداء
يمكن أن يؤثر استخدام VK_CULL_MODE_NONE سلبًا في الأداء لأنّه يفرض على وحدة معالجة الرسومات عرض كل من الوجه الأمامي والخلفي، ما يزيد من عبء عمل العرض.
تقليل الرسم الزائد في مشاهد واجهة المستخدِم
يمكنك إلغاء طلبات الرسم وعمليات العرض غير الضرورية، خاصةً في مشاهد واجهة المستخدم، لتحسين أداء العرض وتقليل معدل استهلاك وحدة معالجة الرسومات. على سبيل المثال، في مشهد واجهة مستخدم يتم فيه عرض العالم بأكمله قبل عرض واجهة المستخدم على الشاشة، يصبح عرض العالم أمرًا غير ضروري.
كيفية تحسين الأداء
استخدِم أداة لتصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc، لتحليل مسار العرض وتحديد فرص التحسين التالية:
- تأكَّد من عدم وجود رسم زائد غير ضروري. في سياقات واجهة المستخدم، حيث يمكن عرض الشاشة بأكملها، تأكَّد من أنّ عمليات العرض السابقة لا يتم رسمها بشكل مفرط بدون داعٍ.
- فعِّل اختبار العمق والاستبعاد لتحسين الأداء.
- ننصحك بعرض الترتيب من الأمام إلى الخلف.