كسر قواعد جمع القمامة الوحدة

ذات مرة ، كان هناك مبرمج لعبة وحدة تسمى Lancelot. واحد عاطفي جدا ، وأود أن أقول. لم يكن يعرف ذلك بعد ، لكنه في النهاية سيواجه الجانب الأكثر ظلمة في مجموعة Unity garbage.

صورة

كانت لانسلوت تبحث دائمًا عن ألقاب أكبر وأكبر للعمل عليها. وهكذا عمل بجد للحصول على فرصته الكبيرة في صناعة الألعاب.

لم يكن الأمر سهلاً ، لأنه كان يعلم.

هذه المواقع في صناعة الألعاب كانت ولا تزال محفوظة لأقلية صغيرة من مبرمجي الألعاب. ولم يكن متأكداً من أنه سيكون على مستوى المعايير ، على أي حال.

لكنه استمر واستمر في صقل مهاراته في البرمجة.

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

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

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

بعد شهور من العمل بدون توقف ، تمكن أخيرًا من تحسين اللعبة بما يكفي ليكون له أساس أساسي للأداء القوي.

ومع ذلك ، كانت مشكلة غير متوقعة قاب قوسين أو أدنى ...

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

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

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

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

إن لعب اللعبة في الواقع الافتراضي مع انخفاض الأداء هذا سيجعل الناس يبدون شاحبين.

وتساءل "كيف يمكن أن يحدث ذلك؟"

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

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

كان لانسلوت ينفد من الخيارات.

شعر باليأس لكنه تمكن من الحفاظ على الهدوء. لقد كان في مواقف أسوأ بعد كل شيء.

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

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

للأسف ، لم يكن ذلك كافيًا.

شعرت ببطء كما لو لم يكن لديه سيطرة على الوضع. لقد كانت صعبة ، لكن مرة أخرى ، استمر .

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

علاوة على ذلك ، أعرب عن قلقه بشأن تأخير إطلاق اللعبة. لم يكن يريد أن يفوت لاعبوه هذا اللقب في عيد الميلاد. لقد تذكر كم كان ممتعًا لعب EverQuest خلال هذه الإجازات. وقال انه لن يأخذ هذا بعيدا عن اللاعبين.

وصل إلى هذه النقطة ، لم يكن لديه خيار آخر سوى تعطيل أداة تجميع مجمعي القمامة.

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

بدأت الأرقام في الوصول إلى جدول البيانات الخاص به: 25 دقيقة و 28 دقيقة و 30 دقيقة ... وأشار أيضًا إلى كيفية زيادة استخدام الكومة بمرور الوقت للتأكد من أنه لن يتجاوز ميزانية آمنة.

باستخدام هذه الأرقام ، أنشأت Lancelot هامشًا آمنًا وسخيًا وأعدت نموذجًا أوليًا . كان يدير مجموعة القمامة يدويًا أثناء شاشات التحميل وكل بضع دقائق.

كان لديه أمل مرة أخرى.

طلب بأدب سؤال وجواب للذهاب إلى اللعبة عشرات المرات.

كانت الذاكرة دائما في حدود الميزانية. لا حوادث. لا آثار جانبية.

هذه الرحلة الطويلة أوصلته إلى النقطة التي استطاع فيها شحن اللعبة.

وتخمين ماذا؟ يستمتع المئات من اللاعبين به خلال فترة عيد الميلاد.

في البداية ، لم يكن مرتاحًا لهذا الحل. لقد كانت خطوة محفوفة بالمخاطر وكان يعرفها. لكنه تمكن من تسحبه.

علمت لانسلوت أن تكون مريحة مع غير مريح . لقد تعلم أن يكون أكثر واقعية . لأن هناك أوقات يجب أن يكون فيها مبرمج.

هل أي شيء من القصة يرن جرس؟ إذا كان الأمر كذلك ، فمن المحتمل أن يكون الحدس مناسبًا لك.

كان هذا مبرمج لي.

في الأوقات التي تحتاجها ، هذه هي الطريقة التي يمكنك من خلالها إدارة أداة تجميع مجمعي البيانات المهملة:

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

انتبه للآثار الجانبية المحتملة:

  • الأعطال : إذا لم تلعب بأمان بما يكفي فسوف تنفد الذاكرة. والأسوأ من ذلك ، أن نظام التشغيل قد يقتل لعبتك عند التبديل بين التطبيقات
  • أوقات جمع القمامة الأطول : زيادة الكومة سيجعل مجموعات البيانات المهملة المستقبلية أبطأ

إذا كنت بحاجة إلى إنتاج كميات كبيرة من القمامة ، فإليك طريقة مباشرة ستعمل فقط:

public class GenerousGarbageCreator : MonoBehaviour { [SerializeField] private int garbageCreationRate = 1024; private static int[] _garbage; void Update() { _garbage = new int[garbageCreationRate]; } } 

هذا هو ما ستحصل عليه في ملف التعريف:

صورة
مجموعة Unity Garbage: الزناد اليدوي المستند إلى الوقت

هناك ترى زيادة استخدام الذاكرة. يتم تمييز استخدام كومة الذاكرة المؤقتة المتنامية كـ "أحادي". لحسن الحظ بالنسبة لنا ، نحن نقوم بتشغيل أداة تجميع النفايات اليدوية كل 3 ثوانٍ.

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

إذا كنت تريد شفرة المصدر لهذا المشروع ، فأنت تعرف مكان العثور عليه (المفسد: هنا).

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

أتطلع للعمل معكم جميعًا في عام 2020.
روبن

Source: https://habr.com/ru/post/ar484710/


All Articles