الجزء الرسمي من الحدث
مساء الخير. أعمل كمبرمج في Owlcat Games ، التي أصدرت واحدة من أنجح ألعاب RPG على الكمبيوتر الروسي Pathfinder: Kingmaker وتعمل حاليًا على تكملة لها ، Pathfinder: Wrath of the Righteous. أثناء نقل أول لعبة من الاستوديو الخاص بنا على وحدة التحكم ، واجهنا مشكلة العثور على تسرب للذاكرة. لأسباب مختلفة ، تبين أن الأدوات القياسية لمحرك Unity والمنصات المستهدفة ليست ملائمة جدًا للتعامل مع التسريبات ، وبالتالي قررنا كتابة الأداة الخاصة بنا ، والتي سأناقشها أدناه.
تم تصميم Owlcat Mono Profiler للتحقيق في استخدام الذاكرة الأحادية في ألعاب Unity. إنه متاح للجميع في شكل ثنائيات مجمعة (تحت Windows) وكود المصدر على Github . على عكس ملف التعريف Unity المدمج ، بالإضافة إلى حزمة Memory Profiler ، فإنه لا يتطلب التقاط لقطات لحالة الذاكرة ، ولكنه يراقب باستمرار كومة Mono ، مما يسمح لك باكتشاف ليس فقط التسريبات ، ولكن أيضًا قمم التخصيص والتخصيصات المتكررة المتكررة. مقارنة بالأدوات الخاصة بالنظام الأساسي مثل Memory Analyzer for PS4 ، فإنه يعرض الأحداث التي تحدث في الذاكرة المجمعة بشكل صحيح.
في هذه المرحلة ، سننهي الإجراءات الرسمية وننتقل إلى القصة الرائعة.
عيب فادح في جميع الأدوات الأخرى
بدأ كل شيء بحقيقة أننا اكتشفنا أن الذاكرة في لعبتنا تتسرب. على جهاز الكمبيوتر ، لم تكن هذه مشكلة ، لأنها لا تتدفق مثل الشلال ، وحتى على الأجهزة الضعيفة هذه الأيام سيكون هناك ذاكرة أكبر من PlayStation 4 أو XBox One. بالإضافة إلى ذلك ، عندما تنفد ذاكرة Windows ، يبدأ في إلقاء الفائض في المبادلة ، وتقتل وحدات التحكم التطبيق الخاص بك ، وتذهب لتكتشف المكان الذي أخطأت فيه.
كان لابد من إزالة أدوات Unity المدمجة على الفور تقريبًا: في Unity 2018.4 لم تعمل في الواقع مع لعبتنا (قد يستغرق أخذ لقطة واحدة لحالة الذاكرة أكثر من 8 ساعات ، ولكن على PlayStation لم أتمكن من انتظارها من حيث المبدأ). لقد تحسنت كثيرًا في 2019.x ، لكن لم نتمكن من التبديل إليه - تغيير الإصدار الرئيسي من المحرك في Unity يعطل كثيرًا.
PlayStation 4 Memory Analyzer. , , ( ). alloc/realloc/free , , memory pool' ..
. , Mono, , , BoehmGC. , , , - , . , .
Unity
, . Owlcat Games , , C++, - , , , , , . , - , , GC - .
, ? … ( , BoehmGC PS4). , - , . - , , gc_malloc__. . C++ - "". "", , . , , , . , --- ( - ) ", , , , ", . , - , , - , - .
BoehmGC : -, ( ) , -, , " ". BoehmGC, , , , , - , , , X, , , . , , , BoehmGC - PlayStation , ( BoehmGC, Mono).
.
, , . - , , , C++. : , il2cpp, , , , , - , … , , - , Unity , , PC, il2cpp .
, , Mono? , . Mono, Unity, . , , , , , , , - (, Mono Unity - , , PlayStation!).
!
, , Heap-Prof, Mono, , , . , , :
, , " ".
( " ") , . , - " ".
, heap-prof dll, , GetProcAddress Mono, , … . mono_object_is_alive. , , , Mono, Massimiliano Mantione, Mono-dev 2009 . , heap-prof, , "The problem is that this is not reliable: "mono_object_is_alive" was not meant to be a public function. And in fact sometimes the heap snapshots are wrong (or the profiler crashes).". , API , SGen, Unity Mono …
( ) , : , mono_object_is_alive . - , , ?! , ( ).
, , , , . , . - - , - ? ? "" - , . , - (, , A B, A B, A - , B, ). , , .
BoehmGC, , - , , - . Mono , , . - … , .
" ! …"
. , , "- " . , , - , , . , .
, , , , , , , ( Unity).
, , , , . , , , , .
, , ( , ). PDB Unity Player: , , , , , , ( , ). , Unity , Microsoft Detours .
. , 20 , 5-10 ( ). , , , , : ~2 ~200Mb . /UI, , , , /UI ( ).
( ) .
, Qt5, ( , , , -, Microsoft). , SQLite ( ) , memory mapped database . Unity, , , ( , ), , , managed - .
. , - . , , , . ( -!) . , Unity, Owlcat Grooming Toolkit. CPU , dotTrace, .