イベントの公式部分
こんにちは。私はOwlcatGamesでプログラマーとして働いています。これは、ロシアで最も成功したコンピューターRPGの1つであるPathfinder:Kingmakerをリリースし、現在、その続編であるPathfinder:Wrath of theRighteousに取り組んでいます。スタジオの最初のゲームをコンソールに移植する際に、メモリリークを見つけるという問題に直面しました。さまざまな理由から、Unityエンジンとターゲットプラットフォームの標準ツールはリークの処理にあまり便利ではないことが判明したため、以下で説明する独自のツールを作成することにしました。
Owlcat Mono Profilerは、UnityゲームでのMonoメモリ使用量を調査するように設計されています。これは、コンパイルされたバイナリ(Windowsの場合)およびGithubのソースコードの形式で誰でも利用できます。組み込みのUnityプロファイラーやMemoryProfilerパッケージとは異なり、メモリ状態のスナップショットを作成する必要はありませんが、Monoヒープを常に監視しているため、リークだけでなく、割り当てのピークや冗長な繰り返し割り当ても検出できます。PS4のメモリアナライザのようなプラットフォーム固有のツールと比較して、ガベージで収集されたメモリで発生するイベントを正しく表示します。
この時点で、手続きを終了し、クールな話に移ります。
他のすべてのツールの致命的な欠陥
それはすべて、私たちのゲームのメモリがリークしていることがわかったという事実から始まりました。PCでは、滝のように流れないため、これは問題ではありませんでした。最近の弱いマシンでも、PlayStation4やXBoxOneよりも多くのメモリがあります。さらに、Windowsがメモリを使い果たすと、余分なものをスワップに投入し始め、コンソールは単にアプリケーションを強制終了し、どこで失敗したかを突き止めます。
組み込みのUnityツールはほぼ即座に一掃する必要がありました。Unity2018.4では、実際にはゲームで機能しませんでした(メモリ状態のスナップショットを1つ取得するのに、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 - .
プロファイラーは誰でも無料で使用できます。弊社以外のお役に立てば幸いです。間違いなく、修正が必要なバグがあり、インターフェースと機能が改善される可能性があります。GitHubでのあなたの提案(そしてプルクエスト!)を楽しみにしています。このプログラムが、UnityゲームデバッグツールキットであるOwlcat GroomingToolkitの最初の部分になることを願っています。長期的には、オープンソースのCPUプロファイラーもあります。これはdotTraceの無料の代替手段になる可能性があり、良心の絡みなしに診断のためにプレーヤーに配布される可能性があります。