Presentamos Owlcat Mono Profiler para Unity

Parte oficial del evento

Buenas tardes. Trabajo como programador en Owlcat Games, que lanzó uno de los juegos de rol de computadora rusos más exitosos, Pathfinder: Kingmaker, y actualmente está trabajando en su secuela, Pathfinder: Wrath of the Righteous. Al portar el primer juego de nuestro estudio en la consola, nos enfrentamos al problema de encontrar pérdidas de memoria. Por varias razones, las herramientas estándar del motor de Unity y las plataformas de destino resultaron no ser muy convenientes para lidiar con las fugas y, por lo tanto, decidimos escribir nuestra propia herramienta, que discutiré a continuación.





Owlcat Mono Profiler está diseñado para investigar el uso de memoria Mono en juegos de Unity. Está disponible para todos en forma de binarios compilados (en Windows) y código fuente en Github . A diferencia del generador de perfiles de Unity integrado, así como del paquete Memory Profiler, no requiere tomar instantáneas del estado de la memoria, sino que monitorea constantemente el montón Mono, lo que le permite detectar no solo fugas, sino también picos de asignación y asignaciones repetidas redundantes. En comparación con las herramientas específicas de la plataforma como Memory Analyzer para PS4, muestra correctamente los eventos que suceden en la memoria recolectada como basura.





En este punto, terminaremos las formalidades y pasaremos a la historia genial.





Un defecto fatal en todas las demás herramientas.

Todo comenzó con el hecho de que descubrimos que la memoria de nuestro juego se está filtrando. En una PC, esto no fue un problema, ya que no fluye como una cascada, e incluso en máquinas débiles estos días habrá más memoria que una PlayStation 4 o XBox One. Además, cuando Windows se queda sin memoria, comienza a arrojar el exceso en un intercambio, y las consolas simplemente eliminan su aplicación y averiguan dónde se equivocó.





Las herramientas integradas de Unity tuvieron que eliminarse casi de inmediato: en Unity 2018.4 en realidad no funcionaban con nuestro juego (tomar una instantánea del estado de la memoria podría llevar más de 8 horas, pero en PlayStation nunca logré esperarlo en principio). Mejoró mucho en 2019.x, pero no pudimos cambiar a él: cambiar la versión principal del motor en Unity se rompe demasiado.





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