Partie officielle de l'événement
Bonne après-midi. Je travaille en tant que programmeur chez Owlcat Games, qui a sorti l'un des RPG informatiques russes les plus réussis Pathfinder: Kingmaker et travaille actuellement sur sa suite, Pathfinder: Wrath of the Righteous. Lors du portage du premier jeu de notre studio sur la console, nous avons dû faire face au problème de la recherche de fuites mémoire. Pour diverses raisons, les outils standard du moteur Unity et des plates-formes cibles se sont avérés peu pratiques pour traiter les fuites, et nous avons donc décidé d'écrire notre propre outil, dont je parlerai ci-dessous.
Owlcat Mono Profiler est conçu pour étudier l'utilisation de la mémoire Mono dans les jeux Unity. Il est accessible à tous sous forme de binaires compilés (sous Windows) et de code source sur Github . Contrairement au profileur Unity intégré, ainsi qu'au package Memory Profiler, il ne nécessite pas de prendre des instantanés de l'état de la mémoire, mais surveille en permanence le tas mono, ce qui vous permet de détecter non seulement les fuites, mais également les pics d'allocation et les allocations répétées redondantes. Par rapport aux outils spécifiques à la plate-forme tels que Memory Analyzer pour PS4, il affiche correctement les événements qui se produisent dans la mémoire récupérée.
À ce stade, nous mettrons fin aux formalités et passerons à l'histoire cool.
Un défaut fatal dans tous les autres outils
Tout a commencé avec le fait que nous avons découvert que la mémoire de notre jeu fuit. Sur un PC, ce n'était pas un problème, car il ne coule pas comme une cascade, et même sur des machines faibles de nos jours, il y aura plus de mémoire qu'une PlayStation 4 ou une XBox One. De plus, Windows, lorsque la mémoire est épuisée, commence à jeter l'excédent dans un swap, et les consoles tuent simplement votre application et déterminent où vous vous êtes trompé.
Les outils Unity intégrés ont dû être balayés presque immédiatement: dans Unity 2018.4, ils ne fonctionnaient pas avec notre jeu (prendre un instantané de l'état de la mémoire pouvait prendre plus de 8 heures, mais sur PlayStation, je n'ai jamais réussi à l'attendre en principe). Il s'est beaucoup amélioré en 2019.x, mais nous ne pouvions pas y passer - le changement de la version principale du moteur dans Unity se brise trop.
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, .