Bagian resmi dari acara tersebut
Selamat sore. Saya bekerja sebagai programmer di Owlcat Games, yang merilis salah satu RPG komputer Rusia paling sukses Pathfinder: Kingmaker dan saat ini sedang mengerjakan sekuelnya, Pathfinder: Wrath of the Righteous. Selama porting game pertama studio kami ke konsol, kami menghadapi masalah menemukan kebocoran memori. Karena berbagai alasan, alat standar mesin Unity dan platform target ternyata sangat tidak nyaman untuk menangani kebocoran, dan oleh karena itu kami memutuskan untuk menulis alat kami sendiri, yang akan saya bahas di bawah.
Owlcat Mono Profiler dirancang untuk menyelidiki penggunaan memori Mono di game Unity. Ini tersedia untuk semua orang dalam bentuk kompilasi binari (di bawah Windows) dan kode sumber di Github . Tidak seperti Unity profiler bawaan, serta paket Memory Profiler, ini tidak perlu mengambil snapshot status memori, tetapi secara konstan memantau heap Mono, yang memungkinkan Anda untuk mendeteksi tidak hanya kebocoran, tetapi juga puncak alokasi dan alokasi berulang yang berlebihan. Dibandingkan dengan alat khusus platform seperti Memory Analyzer untuk PS4, alat ini menampilkan peristiwa yang terjadi pada memori yang dikumpulkan dengan benar.
Pada titik ini, kami akan mengakhiri formalitas dan beralih ke cerita keren.
Cacat fatal di semua alat lainnya
Semuanya dimulai dengan fakta bahwa kami menemukan bahwa memori dalam game kami bocor. Pada PC, ini bukan masalah, karena tidak mengalir seperti air terjun, dan bahkan pada mesin yang lemah belakangan ini akan ada lebih banyak memori daripada PlayStation 4 atau XBox One. Plus, ketika Windows kehabisan memori, itu mulai membuang kelebihan ke swap, dan konsol hanya mematikan aplikasi Anda, dan mencari tahu di mana Anda mengacaukannya.
Alat Unity bawaan harus segera dihapus: di Unity 2018.4 mereka sebenarnya tidak berfungsi dengan game kami (mengambil satu snapshot dari status memori bisa memakan waktu 8+ jam, tetapi di PlayStation saya tidak pernah berhasil menunggunya pada prinsipnya). Ini menjadi jauh lebih baik di 2019.x, tetapi kami tidak dapat mengubahnya - mengubah versi utama mesin di Unity terlalu banyak merusak.
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 - .
Profiler terbuka untuk digunakan gratis oleh semua orang. Saya berharap ini akan bermanfaat bagi orang lain selain perusahaan kami. Tidak diragukan lagi, akan ada bug di dalamnya yang perlu diperbaiki, dan kemungkinan peningkatan pada antarmuka dan fungsionalitas. Saya menantikan saran Anda (dan pull-rquests!) Di GitHub . Saya harap program ini akan menjadi bagian pertama dari toolkit debugging game Unity kami, Owlcat Grooming Toolkit. Dalam jangka panjang, ada juga profiler CPU open source, yang bisa menjadi alternatif gratis untuk dotTrace, yang bisa diberikan kepada pemain untuk diagnosa tanpa sedikitpun hati nurani.