نصائح لتحسين أداء وحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات (GPU)

يوضّح لك هذا المستند كيفية تحسين أداء اللعبة باستخدام أدوات لتحديد المشاكل التي تؤثر سلبًا في أداء وحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات (GPU) وحلّها.

تحسين أداء وحدة المعالجة المركزية

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

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

أدوات تتبُّع توقيت محرّك اللعبة

يمكن أن تساعد الأدوات التالية في إجراء هذا التحليل:

إحصاءات Unreal

في مشاريع Unreal Engine، تسهّل أداة Unreal Insight Tool تحليل معلومات تتبُّع التوقيت الخاصة بكل سلسلة فرعية تتضمّن إطارًا.

على سبيل المثال، يستخدم GameThread عادةً أكبر نسبة من وقت وحدة المعالجة المركزية، ويرجع ذلك بشكل أساسي إلى Tick Time. بالإضافة إلى ذلك، يتم استهلاك جزء كبير من وقت Tick Time في المهام المرتبطة بـ FActorComponentTickFunction.

لتحسين FActorComponentTick، من الضروري استبعاد العمليات الحسابية وتنفيذ عملية الحذف للشخصيات والعناصر الموضوعة خارج مجال رؤية الكاميرا. بالإضافة إلى ذلك، يمكن أن يؤدي استخدام الصور المتحركة المستندة إلى مستوى التفاصيل إلى تحسين الأداء بشكل أكبر.

المخطط الزمني لتتبُّع Unreal Insight الذي يعرض أوقات تنفيذ GameThread وRenderThread وRHIThread
تتبُّع إحصاءات Unreal باستخدام GameThread وRenderThread وRHIThread (انقر للتكبير)

Unity Profiler (Unity)

يكشف التحليل باستخدام Unity Profiler أنّ سلسلة التعليمات الرئيسية تستهلك أكثر من 45 ملي ثانية، حيث تستغرق PostLateUpdate.FinishFrameRendering‏ 16.23 ملي ثانية، ما يجعلها العملية الأكثر استهلاكًا للوقت. ضمن هذا الإطار، تم رصد عمليات استدعاء متعددة للدالة Inl_RenderCameraStack. ننصحك بالتأكّد من ضرورة تفعيل الكاميرات وتحسينها وفقًا لذلك.

المخطط الزمني لأداة Unity Profiler الذي يعرض سلسلة التعليمات الرئيسية في انتظار Gfx.WaitForPresentOnGfxThread
مثال على وحدة معالجة الرسومات (GPU) في Unity Profiler (انقر للتكبير).

أدوات إنشاء الملفات الشخصية على مستوى النظام

استخدِم أدوات إنشاء الملفات الشخصية التالية:

Perfetto

باستخدام أداة Perfetto لتتبُّع الأداء، يمكنك تحديد مهام وحدة المعالجة المركزية (CPU) وتفاصيل التنفيذ لكل سلسلة محادثات على جهاز يعمل بنظام التشغيل Android. يتيح لك ذلك تحديد المؤثّرات السلبية في الأداء من خلال تحليل بيانات تنفيذ سلسلة التعليمات البرمجية.

حالة الحمل الزائد لوحدة المعالجة المركزية

يشير التتبُّع إلى أنّ عبء العمل على GameThread وRenderThread يتسبّب في حدوث تأخيرات في QueuePresent في RHI Thread، ما يؤدي إلى سيناريو مرتبط بوحدة المعالجة المركزية (CPU)، استنادًا إلى VSync.

تتبُّع Perfetto يعرض أوقات التنفيذ لكل من GameThread وRenderThread وRHIThread
عمليات تتبُّع Perfetto مع تفاصيل تنفيذ وحدة المعالجة المركزية (انقر للتكبير)

حالة الحمل الزائد لوحدة معالجة الرسومات

يشير التتبُّع إلى أنّ عملية إكمال وحدة معالجة الرسومات نفسها تتجاوز 25 ملي ثانية، ما يشير إلى سيناريو مرتبط بوحدة معالجة الرسومات.

تتبُّع Perfetto يعرض حظر اكتمال وحدة معالجة الرسومات في انتظار اكتمالها
عمليات تتبُّع Perfetto تتضمّن تفاصيل حول الحمل الزائد لوحدة معالجة الرسومات (انقر للتكبير).

Simpleperf

لتحديد الدوال التي تستخدم وحدة المعالجة المركزية بأعلى معدّل حالي، يمكن استخدام أداة simpleperf. للحصول على أفضل النتائج، يُنصح بترتيب هذه الوظائف حسب الأولوية ومعالجة الوظائف الأكثر استخدامًا أولاً.

ناتج Simpleperf يعرض الدوال التي تستخدم وحدة المعالجة المركزية بشكل مكثّف
أداة Simpleperf لتحديد المشاكل في وحدة المعالجة المركزية: تحليل التسلسل الهرمي لطلبات الدوال واستخدام الموارد (انقر للتكبير).

تساعدك أداة Simpleperf في فحص البيانات حول الدوال التي تستخدم معظم وقت وحدة المعالجة المركزية. لتحسين استخدام وحدة المعالجة المركزية، ابدأ بالدوال التي تستخدم أكبر قدر من وحدة المعالجة المركزية. في هذا المثال، تستخدم العملية USkeletalMeshComponent، المرتبطة بالصورة المتحركة في ActorComponentTickFunctions، معظم وحدة المعالجة المركزية.

تحسين وحدة معالجة الرسومات

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

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

توضّح الأقسام التالية طرقًا وأدوات لتحسين أداء وحدة معالجة الرسومات.

إزالة RenderPasses غير الضرورية

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

استخدِم برنامج تصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc، لتحليل مسار العرض وتحديد فرص التحسين.

  1. عدم توفّر طلبات رسم: تحقَّق مما إذا كان تمرير العرض يتضمّن أي طلبات رسم. إذا لم يكن يتضمّن طلبات رسم، أزِل البطاقة.

  2. الناتج غير المستخدَم: تحقَّق مما إذا كانت عمليات التمرير اللاحقة تصل إلى نواتج عملية العرض أو تعرضها، مثل اللون أو العمق. إذا لم يكن كذلك، أزِل البطاقة.

  3. البطاقات القابلة للدمج: حدِّد البطاقات التي يمكنك دمجها:

    • إطار المخزن المؤقت أو المرفقات نفسها
    • عمليات التحميل أو التخزين المتوافقة
    • ما مِن حواجز اعتمادية بينهما
متصفّح الأحداث في RenderDoc يعرض عمليات العرض في Vulkan وطلبات الرسم
تسلسل أوامر RenderPass ووحدة معالجة الرسومات في RenderDoc (انقر للتكبير)

تقليل عمليات التحميل أو التخزين

تتطلّب عمليات التحميل أو التخزين الكثير من الموارد لأنّها تستخدم قدرًا كبيرًا من الذاكرة. تقليل عمليات التحميل والتخزين غير الضرورية نفِّذ هذه الإجراءات فقط عندما تكون المرفقات داخل RenderPass مطلوبة. في ما عدا ذلك، استبدِلها بعمليات Clear أو Don't care لتقليل الحمل الزائد.

كيفية تحسين الأداء

استخدِم أداة لتصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc، لتحليل مسار العرض وتحديد فرص التحسين التالية:

  1. التحميل: إذا كان المرفق الخاص بتمرير العرض لا يستخدم بيانات من تمرير أو مرفق سابق، لن تكون عملية التحميل ضرورية. في مثل هذه الحالات، يمكن أن يؤدي استخدام Don't care أو Clear إلى تقليل النفقات العامة.

  2. التخزين: إذا لم يتم استخدام مرفق تمرير العرض بعد تمرير العرض الحالي، لن تكون عملية التخزين ضرورية. في مثل هذه الحالات، استخدِم إما Don't care أو Clear.

  3. استبدال: تحديد ما إذا كان يمكن استبدال إعدادات التحميل أو التخزين الحالية بـ Clear أو Don't Care بدون التأثير في الإطار النهائي.

أداة فحص الموارد ومتصفّح الأحداث في RenderDoc لتحليل تخطيط الصورة وعمليات العرض
تحليل مسار العرض في RenderDoc (انقر للتكبير)

تجنُّب تجاهل البكسل لتفعيل Early-Z

تعمل تقنية Early-Z على تحسين الأداء على المنصات المتوافقة مع الأجهزة الجوّالة. ومع ذلك، يؤدي تضمين discard تعليمات ضمن أداة تظليل إلى إيقاف Early-Z تلقائيًا. إذا لم تكن discard التعليمات ضرورية، أزِلها.

تسريع Early-Z

يقلّل هذا التحسين بشكل كبير من عمليات تظليل الأجزاء ويحسّن أداء وحدة معالجة الرسومات.

Early-Z اختبار العمق والاستنسل

جدول يقارن بين مقاييس أداء وحدة المعالجة المركزية ووحدة معالجة الرسومات عند تفعيل ميزة Early-Z وإيقافها
تأثير تسريع Early-Z على الأداء (انقر للتكبير).

كيفية تحسين الأداء

استخدِم أداة لتصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc، لتحليل مسار العرض وتحديد فرص التحسين التالية:

  1. استخدام discard في أدوات تظليل الأجزاء: تمنع الكلمة الرئيسية discard وحدة معالجة الرسومات من إجراء اختبارات العمق المبكرة لأنّه لا يمكن معرفة مدى ظهور الجزء مسبقًا.

  2. تعديل gl_FragDepth: يؤدي تعديل gl_FragDepth بشكل ديناميكي إلى تغيير عمق جزء من الصورة، ما يؤدي إلى إيقاف تحسين Early-Z لأنّ العمق النهائي غير معروف قبل معالجة الجزء.

  3. تفعيل ميزة "الشفافية إلى التغطية": عند تفعيل ميزة "الشفافية إلى التغطية" (التي يتم استخدامها غالبًا في عرض MSAA)، تعتمد تغطية الأجزاء على قيم الشفافية. ويمكن أن يؤدي ذلك إلى تأخير اختبار العمق وإيقاف ميزة Early-Z.

مقارنة بين أجزاء كل بكسل مع الكلمة الرئيسية لبرنامج التظليل discard وبدونها
أداة تصحيح أخطاء وحدة معالجة الرسومات RenderDoc للتحليل (انقر للتكبير).

تحسين تنسيق النسيج

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

كيفية تحسين الأداء

استخدِم أداة لتصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc، لتحليل مسار العرض وتحديد فرص التحسين التالية:

  1. استخدام D24S8 بدلاً من D32S8 لمخازن مؤقتة للعمق والاستنسل: يؤدي استخدام D24S8 لمخازن مؤقتة للعمق والاستنسل إلى تقليل استهلاك الذاكرة بنسبة% 20 مقارنةً بـ D32S8، مع عدم وجود فرق ملحوظ في الجودة المرئية في معظم التطبيقات.
  2. استخدام ضغط ASTC لزخارف الألوان: يقلّل ضغط ASTC بشكل كبير من استخدام ذاكرة الزخرفة، وذلك بمقدار يصل إلى 8 مرات مقارنةً بالتنسيقات غير المضغوطة، مع الحفاظ على جودة مرئية عالية.
  3. استخدام تنسيقات نصف عائمة بدلاً من التنسيقات العائمة الكاملة: استخدِم R16F أو RG16F لتقليل معدل نقل البيانات في الذاكرة واستهلاك مساحة التخزين. هذه التنسيقات مناسبة تمامًا لمخازن مؤقتة للمعالجة اللاحقة.

تحسين تعقيد الأشكال الهندسية

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

كيفية تحسين الأداء

استخدِم أدوات إنشاء الملفات الشخصية وأدوات تصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc أو Android GPU Inspector أو أدوات تحليل الأداء الأخرى، لتحديد المشاكل المتعلقة بالهندسة والتي تؤدي إلى بطء الأداء.

  1. تقليل عدد المضلّعات: قلِّل من استخدام المضلّعات، خاصةً للأجسام الصغيرة أو البعيدة.

  2. استخدام مستوى التفاصيل (LOD): استنادًا إلى مسافة الكاميرا، يتم تلقائيًا استخدام شبكات أبسط.

  3. دمج الشبكات الصغيرة (Merge Small Meshes): يمكنك دمج العناصر الثابتة لتقليل طلبات الرسم والعبء الزائد على وحدة المعالجة المركزية.

  4. الاستبعاد حسب المخروط الناقص والحجب: تجنَّب عرض الكائنات التي تقع خارج نطاق العرض أو التي تحجبها عناصر أخرى.

إزالة المرفقات غير الضرورية

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

كيفية تحسين الأداء

استخدِم أدوات إنشاء الملفات الشخصية وأدوات تصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc أو Android GPU Inspector أو أدوات تحليل الأداء الأخرى، لتحديد المشاكل المتعلقة بأداء الأشكال الهندسية.

  1. التحقّق من الاستخدام الفعلي: هل هناك أي طلبات رسم أو برامج تظليل تكتب في المرفق أو تقرأ منه؟
  2. تحليل ناتج الإطار: استخدِم RenderDoc أو أدوات مشابهة لتحديد ما إذا كان المرفق يساهم في الصورة النهائية.
  3. استخدام المرفقات المؤقتة أو الوهمية: يجب استخدام المرفقات المؤقتة أو عملية تخزين "لا يهم" للبيانات المؤقتة التي لا تتطلب تخزينًا دائمًا.

تحسين دقة التظليل

يؤدي استخدام دقة عالية جدًا (على سبيل المثال، highp بدلاً من mediump أو lowp) في برامج التظليل إلى زيادة حجم المعالجة على وحدة معالجة الرسومات واستهلاك الطاقة والضغط على السجل، خاصةً على وحدات معالجة الرسومات الخاصة بالأجهزة الجوّالة. باستخدام أقل دقة مناسبة للمتغيرات (مثل المواضع والألوان والأشعة فوق البنفسجية)، يمكنك تحسين الأداء بدون تأثير مرئي ملحوظ.

جدول يقارن بين مقاييس أداء وحدة المعالجة المركزية ووحدة معالجة الرسومات عند استخدام دقة التظليل المتوسطة مقارنةً بالدقة العالية
تأثير دقة التظليل في الأداء (انقر للتكبير).

كيفية تحسين الأداء

استخدِم أدوات إنشاء الملفات الشخصية وأدوات تصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc أو Android GPU Inspector أو أدوات تحليل الأداء الأخرى، لتحديد المشاكل المتعلقة بالهندسة التي تؤدي إلى بطء الأداء.

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

  2. استخدام أدوات تصحيح أخطاء وحدة معالجة الرسومات: يمكن لأدوات التشخيص، مثل RenderDoc أو أدوات تحليل أداء وحدات معالجة الرسومات على الأجهزة الجوّالة (مثل AGI أو Mali/GPU Inspector)، تحديد الاستخدام المرتفع للسجلّات أو توقّف أدوات التظليل المرتبط بمشاكل الدقة.

أداة تحليل الأداء "استخدام Mali المتفاوت" تعرض استيفاء 16 بت بجانب رمز التظليل باستخدام mediump
مثال على أدوات إنشاء الملفات الشخصية وأدوات تصحيح أخطاء وحدة معالجة الرسومات (انقر للتكبير)

تفعيل ميزة "إخفاء الوجوه الخلفية"

غالبًا ما يكون عرض المثلثات التي لا تواجه الكاميرا (الأسطح الخلفية) غير ضروري للأجسام الصلبة.

كيفية تحسين الأداء

يمكن أن يؤثر استخدام VK_CULL_MODE_NONE سلبًا في الأداء لأنّه يفرض على وحدة معالجة الرسومات عرض كل من الوجه الأمامي والخلفي، ما يزيد من عبء عمل العرض.

سجلّ أوامر Vulkan يعرض vkCmdSetCullMode مضبوطًا على VK_CULL_MODE_NONE
سجلّات تصحيح الأخطاء مع إزالة الوجوه الخلفية (انقر للتكبير)

تقليل الرسم الزائد في مشاهد واجهة المستخدِم

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

كيفية تحسين الأداء

استخدِم أداة لتصحيح أخطاء وحدة معالجة الرسومات، مثل RenderDoc، لتحليل مسار العرض وتحديد فرص التحسين التالية:

  1. تأكَّد من عدم وجود رسم زائد غير ضروري. في سياقات واجهة المستخدم، حيث يمكن عرض الشاشة بأكملها، تأكَّد من أنّ عمليات العرض السابقة لا يتم رسمها بشكل مفرط بدون داعٍ.
  2. فعِّل اختبار العمق والاستبعاد لتحسين الأداء.
  3. ننصحك بعرض الترتيب من الأمام إلى الخلف.
متصفّح الأحداث وعارض النسيج في RenderDoc يحدّدان تمريرة عرض زائد للبكسل غير ضرورية
مثال على إزالة عمليات سحب وعرض غير ضرورية (انقر للتكبير).