Unity の下部で C# を実行するには、Mono と IL2CPP の 2 つのメカニズムがあります。
1.モノ
C# や VB などの CLI 仕様に準拠した高級言語は、まずそれぞれのコンパイラによって中間言語: IL (CIL) にコンパイルされ、実際に実行する必要がある場合、これらの IL はランタイム ライブラリに読み込まれます。 (CLR)、つまり VM では、VM はアセンブリ コード (JIT) に動的にコンパイルされてから実行されます。
Mono を使用する場合のスクリプトのコンパイルと操作を次の図に示します。
3 つの主要なスクリプトは IL にコンパイルされます。ゲームが実行されると、プロジェクト内の IL およびその他のサードパーティ互換の DLL が Mono VM 仮想マシンに配置され、仮想マシンによってマシン コードに解析されて実行されます。
2.IL2CPP
IL2CPP は、主に次の 2 つの部分で構成されています。
1. AOT 静的コンパイル コンパイラ (il2cpp.exe) は、IL を C++ ソース コードに変換し、コンパイルのために各プラットフォームの C++ コンパイラに送信して、プラットフォームの互換性を実現します。
2. ランタイム ライブラリ (libil2cpp)。ランタイム ライブラリは、ガベージ コレクション、スレッド/ファイルの取得、管理対象データ構造のネイティブ生成を直接変更する内部呼び出しなどのサービスと抽象化を提供します。
IL2CPP を使用する場合のスクリプトのコンパイルと動作を下図に示します。
Unity をコンパイルしてパッケージ化するとき、IL2CPP モードも最初にプロジェクト内のファイルを IL にコンパイルしますが、IL2CPP はこれらの IL を仮想マシンで直接実行するのではなく、IL2CPP をプロジェクト IL および他の IL と共に使用して、これらの IL を CPP に変換します。 ( C Plus Plus または C++) コードを実行し、その C++ コードをローカル コンパイラ (特定の実行中のマシン プラットフォームのコンパイラ) に配置して、実行可能なネイティブ アセンブリ コードにコンパイルし、自己開発の IL2CPP VM を使用して実行します。
3. 機能比較
アドバンテージ |
欠点 |
|
単核症 |
1. アプリのビルドは非常に高速です 2. Mono の JIT (ジャスト イン タイム コンパイル) メカニズムにより、より多くのマネージド ライブラリをサポートします。 3. ランタイム コードの実行、Android での dll の動的読み込みアセンブリのホット アップデートをサポート 4. コードはマネージ アセンブリ (モノまたは .net によって生成された .dll ファイル) として公開する必要があります。 |
1. メンテナンスと著作権の制限が難しく、C# の強力な機能は mono の下位バージョンでは使用できない |
IL2CPP |
1.Monoに比べてコード生成が大幅に改善 2. 生成された C++ コードをデバッグできます 3.プログラムの実行効率はMonoよりも高く、実行速度が速い 4. エンジン コード ストリッピングを有効にして、コード サイズを縮小できます。 5.マルチプラットフォーム移植は非常に便利です |
1. AOT (Ahead of Time) コンパイルのみがサポートされています 2. Mono よりもアプリケーションのビルドが遅い |
IL2CPP は、プロジェクトの開発と公開に適していますが、バージョンの反復速度を向上させるために、開発中に Mono モードに切り替えることができます (アプリケーションのビルドが高速になります)。