آلية عمل ميزة "التحسين الموجَّه إلى الملف الشخصي" (PGO)

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

رسم تخطيطي يوضح نظرة عامة مرئية حول
آلية عمل PGO

الشكل 1. نظرة عامة على آلية عمل PGO

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

آلية عمل الإصدارات المحسَّنة بدون PGO

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

يُشار إلى بعض هذه الإشارات صراحةً من المطوِّر، على سبيل المثال، في الإصدار 20 من لغة C++ أو الإصدارات الأحدث، باستخدام تلميحات عن الاتجاه الفرعي، مثل [[likely]] و[[unlikely]]. هناك مثال آخر، ألا وهو استخدام الكلمة الرئيسية inline أو __forceinline (مع أنّ استخدام الكلمة الرئيسية سابقًا أفضل وأكثر مرونة بشكل عام). تفترض بعض برامج التجميع تلقائيًا أنّ المرحلة الأولى من الفرع (أي عبارة if، وليس الجزء else) هي الأكثر احتمالاً. وقد يضع المحسِّن أيضًا افتراضات من التحليل الثابت للرمز البرمجي حول كيفية تنفيذه - ولكن هذا عادة ما يكون محدودًا من حيث النطاق.

المشكلة في هذه الأساليب

إنشاء ملف شخصي

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

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

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

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

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

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

ويمكن بعد ذلك استخدام نص برمجي لنسخ بيانات الملف الشخصي من جهاز الاختبار، وتحميلها إلى مستودع مركزي حيث يمكن التقاطها لاستخدامها في وقت لاحق.

دمج بيانات الملف الشخصي

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

تم تصميم PGO لدمج نتائج عمليات تشغيل ملفات شخصية متعدّدة الآلية معًا، وتجري AGDE ذلك أيضًا نيابةً عنك تلقائيًا إذا كانت لديك ملفات متعدّدة في مشروع واحد.

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

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

إنشاء إصدارات محسَّنة موجَّهة إلى الملف الشخصي

بعد إضافة بيانات الملف الشخصي إلى مشروعك، يمكنك استخدامها لإنشاء ملف قابل للتنفيذ من خلال تفعيل PGO في وضع التحسين في إعدادات الإصدار.

حيث يؤدي ذلك إلى توجيه محسن المحول إلى استخدام بيانات الملف الشخصي التي التقطتها سابقًا عند اتخاذ قرارات التحسين.

حالات استخدام التحسين الموجَّه إلى الملف الشخصي

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

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

تحسُّن متوقع في الأداء مع PGO

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

بشكل عام، قد يكون التقدير المحفّظ هو أن تكاليف وحدة المعالجة المركزية (CPU) ستقلّل بنسبة 5% تقريبًا في سلاسل المحادثات الرئيسية. وقد تظهر لك نتائج مختلفة.

النفقات العامة للأجهزة

تُعدّ أدوات PGO شاملة، وعلى الرغم من إنشائها تلقائيًا، إلا أنّها ليست مجانية. قد تختلف النفقات العامة لأدوات PGO اعتمادًا على قاعدة التعليمات البرمجية لديك.

تكلفة أداء الأجهزة الموجهة للملف الشخصي

قد تلاحظ انخفاضًا في عدد اللقطات في الثانية مع إصدارات الأجهزة المُستخدَمة. في بعض الحالات، واعتمادًا على مدى استخدام وحدة المعالجة المركزية (CPU) بنسبة تصل إلى% 100 أثناء التشغيل العادي، قد يكون هذا الانخفاض كبيرًا إلى درجة تجعل أسلوب اللعب العادي أمرًا صعبًا.

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

كما أن لهذا النوع من الوظائف فوائد كبيرة أخرى، مثل مضاعفة جهد المختبِر: حيث يمكن لأحد المختبرين تسجيل الإدخال الخاص به على أحد الأجهزة، ومن ثم يمكن تشغيله على عدة أنواع مختلفة من الأجهزة لأغراض اختبار الدخان.

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

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

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

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

تكلفة الذاكرة للأجهزة الموجّهة إلى الملف الشخصي

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

متى يجب تعديل بيانات ملفك الشخصي أو تجاهلها

عليك تعديل ملفاتك الشخصية كلما أجريت تغييرًا كبيرًا على الرمز (أو محتوى اللعبة).

وذلك يعتمد بدقة على بيئة الإنشاء، ومكان التطوير.

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

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

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

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

بعد ذلك، يمكن لضمان جودة الشحن أن يبني عملية تشغيل نهائية لضمان جودة الإطلاق.