Einführung in Owlcat Mono Profiler for Unity

Offizieller Teil der Veranstaltung

Guten Tag. Ich arbeite als Programmierer bei Owlcat Games, das eines der erfolgreichsten russischen Computer-RPGs Pathfinder: Kingmaker veröffentlicht hat und derzeit an seiner Fortsetzung Pathfinder: Wrath of the Righteous arbeitet. Beim Portieren des ersten Spiels unseres Studios auf die Konsole hatten wir das Problem, Speicherlecks zu finden. Aus verschiedenen Gründen erwiesen sich die Standardwerkzeuge der Unity-Engine und der Zielplattformen als nicht sehr praktisch für den Umgang mit Lecks. Daher haben wir beschlossen, unser eigenes Werkzeug zu schreiben, auf das ich weiter unten eingehen werde.





Owlcat Mono Profiler wurde entwickelt, um die Nutzung des Mono-Speichers in Unity-Spielen zu untersuchen. Es steht allen in Form von kompilierten Binärdateien (unter Windows) und Quellcode auf Github zur Verfügung . Im Gegensatz zum integrierten Unity-Profiler und dem Memory Profiler-Paket müssen keine Snapshots des Speicherstatus erstellt werden, sondern der Mono-Heap wird ständig überwacht, sodass Sie nicht nur Lecks, sondern auch Zuordnungsspitzen und redundante wiederholte Zuweisungen erkennen können. Im Vergleich zu plattformspezifischen Tools wie Memory Analyzer für PS4 werden Ereignisse, die im Speicherbereinigungsspeicher auftreten, korrekt angezeigt.





An diesem Punkt werden wir die Formalitäten beenden und zur coolen Geschichte übergehen.





Ein schwerwiegender Fehler bei allen anderen Werkzeugen

Alles begann mit der Tatsache, dass wir herausgefunden haben, dass die Erinnerung in unserem Spiel leckt. Auf einem PC war dies kein Problem, da es nicht wie ein Wasserfall fließt und selbst auf schwachen Computern heutzutage mehr Speicher als auf PlayStation 4 oder XBox One vorhanden ist. Wenn Windows nicht mehr genügend Arbeitsspeicher hat, wird der Überschuss in einen Swap geworfen, und Konsolen beenden einfach Ihre Anwendung und finden heraus, wo Sie Fehler gemacht haben.





Die eingebauten Unity-Tools mussten fast sofort weggefegt werden: In Unity 2018.4 funktionierten sie tatsächlich nicht mit unserem Spiel (ein Schnappschuss des Speicherzustands konnte mehr als 8 Stunden dauern, aber auf PlayStation konnte ich im Prinzip nie darauf warten). 2019.x wurde es viel besser, aber wir konnten nicht darauf umsteigen - das Ändern der Hauptversion der Engine in Unity bricht zu viel.





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, .








All Articles