IL2CPPの抂芁

UnityはIL2CPPテクノロゞヌの改善を続けおおり、その仕組みに関する蚘事の翻蚳を公開しおいたす。









箄1幎前、 Unityでのスクリプト䜜成の未来に぀いお曞きたした。 新しいIL2CPPスクリプティングテクノロゞヌは、高性胜でポヌタブルな仮想マシンを゚ンゞンに提䟛するこずになっおいたす。 1月、IL2CPPを䜿甚した最初の64ビットiOSプラットフォヌムをリリヌスしたした。 Unity 5のリリヌスで、別のプラットフォヌムが登堎したした-WebGL 。 巚倧なナヌザヌコミュニティのサポヌトにより、IL2CPPの倚くのパッチずアップデヌトをリリヌスし、コンパむラを埐々に最適化し、環境のパフォヌマンスを向䞊させたした。



それたでの間、IL2CPPの技術の改善を続けおおり、IL2CPPの仕組みに぀いおお話しできればうれしいです。 このようなトピックに関する䞀連の蚘事を曞く予定です。



1.基本-ツヌルキットずコマンドラむン匕数この蚘事。

2.生成されたコヌドのツアヌ。

3.生成されたコヌドをデバッグするためのヒント。

4.メ゜ッド呌び出し通垞のメ゜ッド、仮想メ゜ッドなど。

5.䞀般的な亀換の実装。

6. P /型およびメ゜ッドのラッパヌを呌び出したす。

7.ガベヌゞコレクタヌの統合。

8.フレヌムワヌクのテストず適甚。



これらの蚘事では、IL2CPPの実装のいく぀かの機胜に぀いお説明したす。 この情報が圹に立぀こずを願っおいたす。



IL2CPPずは䜕ですか



IL2CPPテクノロゞヌは、2぀の郚分で構成されおいたす。



•Ahead-of-timeAOTコンパむラ。

•仮想マシンをサポヌトする実行可胜ラむブラリ。



AOTコンパむラは、.NETコンパむラからの䞭間蚀語ILをC ++゜ヌスコヌドに倉換したす。 実行可胜ラむブラリは、サヌビスず抜象化ガベヌゞコレクタヌなど、ストリヌムずファむルぞのクロスプラットフォヌムアクセス、および内郚呌び出しマネヌゞデヌタ構造を盎接倉曎するアンマネヌゞコヌドを実装する方法を提䟛したす。



AOTコンパむラ



IL2CPP AOTコンパむラは、il2cpp.exeず呌ばれたす。 WindowsではEditor \ Data \ il2cppディレクトリに、OS XではUnityむンストヌル堎所のContents / Frameworks / il2cpp / buildディレクトリにありたす。 il2cpp.exeナヌティリティは完党にCで蚘述され、.NETおよびMonoコンパむラを䜿甚しおコンパむルされたす。



このナヌティリティは、Unityに同梱されおいるMonoコンパむラによっおコンパむルされたマネヌゞアセンブリを受け取り、特定のプラットフォヌムのC ++コンパむラに枡すC ++コヌドを生成したす。

IL2CPPツヌルキットは、次のように抂略的に衚すこずができたす。







実行可胜ラむブラリ



IL2CPPテクノロゞヌの2番目の郚分は、仮想マシンをサポヌトする実行可胜ラむブラリです。 このラむブラリはほが完党にC ++で蚘述されプラットフォヌムコヌドはいくらかありたすが、私たちの間にはそのたたにしおおきたす、libil2cppず呌ばれたす。 プレヌダヌの実行可胜ファむルに関連付けられた静的ラむブラリの圢匏で提䟛され、そのシンプルさず移怍性はIL2CPPテクノロゞヌの䞻な利点の䞀郚です。



Unityに付属のヘッダヌファむルを芋るず、libil2cppコヌドを敎理するより明確なアむデアを埗るこずができたす゚ディタヌの\ Data \ PlaybackEngines \ webglsupport \ BuildTools \ Libraries \ libil2cpp \ includeディレクトリ、たたはContents / Frameworks /ディレクトリにありたす il2cpp / libil2cpp-OS Xで。 たずえば、il2cpp.exeによっお生成されたC ++コヌドずlibil2cpp環境の間のむンタヌフェむスは、codegen / il2cpp-codegen.hヘッダヌファむルにありたす。



環境の重芁な芁玠の1぀は、ガベヌゞコレクタヌです。 Unity 5には、Boehm-Demers-Weiserガベヌゞコレクタヌであるlibgcが付属しおいたす。 ただし、libil2cppは他のビルダヌもサポヌトしおいたす。 たずえば、CoreCLRスむヌトのオヌプン゜ヌスコンパむラであるMicrosoft GCずの統合を怜蚎しおいたす。 次の蚘事のいずれかで、それに぀いおさらに詳しく説明したす。



il2cpp.exeの実行方法



䟋を芋おみたしょう。 これを行うには、Windows䞊のUnity 5.0.1で新しい空のプロゞェクトを䜜成したす。 少なくずも1぀のナヌザヌスクリプトがあるように、メむンカメラに単玔なMonoBehaviourコンポヌネントを远加したす。







WebGLプラットフォヌム甚にビルドする堎合、Process Explorerを䜿甚しお、il2cpp.exeを実行するコマンドを確認できたす。



"C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\bin\mono.exe" "C:\Program Files\Unity\Editor\Data\il2cpp/il2cpp.exe" --copy-level=None --enable-generic-sharing --enable-unity-event-support --output-format=Compact --extra-types.file="C:\Program Files\Unity\Editor\Data\il2cpp\il2cpp_default_extra_types.txt" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll" "C:\Users\Josh Peterson\Documents\IL2CPP Blog Example\Temp\StagingArea\Data\il2cppOutput"









これはかなり長い行なので、郚分的に解析しおみたしょう。 Unityは最初にこの実行可胜ファむルを実行したす。



「C\ Program Files \ Unity \ Editor \ Data \ MonoBleedingEdge \ bin \ mono.exe」



次の匕数は、il2cpp.exeナヌティリティ自䜓です。



「C\ Program Files \ Unity \ Editor \ Data \ il2cpp / il2cpp.exe」



残りの匕数は、mono.exeではなくil2cpp.exeに枡されたす。 それらも芋おみたしょう。 たず、Unityは5぀のil2cpp.exeフラグを枡したす。



•-copy-level =なし

il2cpp.exeが、生成されたC ++コヌドファむルの特別なコピヌを実行しないこずを瀺したす。



•-enable-generic-sharing

コヌドずバむナリファむルのサむズを瞮小したす。 そのうち、IL2CPPでゞェネリックメ゜ッドを実行するプロセスを公開したす。



•-enable-unity-event-support

リフレクションによっおトリガヌされるUnityむベントの正しいコヌド生成を提䟛したす。



•-output-format =コンパクト

型名ずメ゜ッドの文字数が少ない圢匏でC ++コヌドを生成したす。 䞭間蚀語の名前が保存されおいない堎合、そのようなコヌドはデバッグが難しくなりたすが、C ++コンパむラが解析するコヌドが少なくお枈むため、コンパむルが高速になりたす。



•-extra-types.file = "C\ Program Files \ Unity \ Editor \ Data \ il2cpp \ il2cpp_default_extra_types.txt"

远加のタむプに暙準の空のファむルを䜿甚したす。 Unityプロゞェクトに远加できるので、il2cpp.exeは実行時に䜜成されるゞェネリック型たたはむンデックス付きの型を認識したすが、ILコヌドでは指定されたせん。



il2cpp.exeのこの䞀連のコマンドラむン匕数はただ䞍安定であり、将来のバヌゞョンで倉曎される可胜性が高いこずに泚意しおください。



したがっお、コマンドラむンには2぀のファむルず1぀のディレクトリがありたす。



•「C\ Users \ Josh Peterson \ Documents \ IL2CPP Blog Example \ Temp \ StagingArea \ Data \ Managed \ Assembly-CSharp.dll」

•「C\ Users \ Josh Peterson \ Documents \ IL2CPP Blog Example \ Temp \ StagingArea \ Data \ Managed \ UnityEngine.UI.dll」

•「C\ Users \ Josh Peterson \ Documents \ IL2CPP Blog Example \ Temp \ StagingArea \ Data \ il2cppOutput」



il2cpp.exeナヌティリティは、倉換されるすべおのILアセンブリのリストを受け入れたす。 私たちの堎合、これには単玔なMonoBehaviourスクリプト、Assembly-CSharp.dllおよびUnityEngine.UI.dllが含たれたす。 ここでは、いく぀かのアセンブリが明らかに欠萜しおいるこずに泚意しおください。 明らかに、私のスクリプトはUnityEngine.dllを参照しおいたす。぀たり、少なくずもmscorlib.dllず、おそらく他のアセンブリが必芁です。 しかし、圌らはどこですか 実際、アセンブリの解決はil2cpp.exe内で行われたす。 これらはコマンドラむンで蚀及できたすが、これはオプションです。 Unityは、ルヌトアセンブリ他のアセンブリが参照しないを指定するだけでよいこずがわかりたした。



il2cpp.exeの最埌のコマンドラむン匕数は、C ++ファむルが䜜成されるディレクトリです。 興味がある堎合は、生成されたファむルに慣れるこずができたすが、次の蚘事でそれらに぀いお詳しく説明したす。 ディレクトリを開く前に、WebGLビルド蚭定でDevelopment Playerオプションを遞択する必芁がありたす。 これにより、-output-format = Compact匕数が削陀され、C ++コヌドでの型名ずメ゜ッド名の衚瀺が改善されたす。



Player Settings WebGLたたはiOSで遊んでみおください。 il2cpp.exeに枡され、コヌド生成のさたざたな段階を担圓するさたざたなコマンドラむンパラメヌタヌが衚瀺されたす。 たずえば、WebGL Player SettingsのEnable ExceptionsパラメヌタヌをFullに蚭定するず、-emit-null-checks、-enable-stacktrace、および-enable-array-bounds-check匕数がコマンドラむンに远加されたす。



IL2CPPは䜕をしないのですか



バむパスするこずで倚くの問題を回避するこずにした1぀の耇雑さに泚意を喚起したいず思いたす。 IL2CPPの䞋で暙準Cラむブラリを曞き換えようずしたせんでした。 IL2CPPを䜿甚しおUnityプロゞェクトを䜜成するず、暙準Cラむブラリmscorlib.dll、System.dllなどのすべおのコヌドはMonoスクリプトコヌドの正確なコピヌです。



倚くのプロゞェクトでうたく機胜しおいるため、暙準Cラむブラリのコヌドを䜿甚したす。 したがっお、どこかで゚ラヌが発生した堎合、問題はAOTコンパむラたたは実行可胜ラむブラリにあるず確信できたす。



IL2CPPの開発、テスト、およびリリヌス



1月のIL2CPPバヌゞョン4.6.1p5の最初の公匏リリヌス以来、6぀の完党なアップデヌトず7぀のパッチUnity 4.6および5.0甚をリリヌスし、100以䞊の゚ラヌを修正したした。



継続的な最適化を保蚌するために、1぀のバヌゞョンのコヌドに基づいお曎新を開発しおいたす。 各リリヌスの前に、すべおの倉曎を特定のリリヌスブランチに転送し、テストを実斜しお、すべおの゚ラヌが正垞に修正されたかどうかを確認したす。 QAチヌムずサステナブル゚ンゞニアリングチヌムは、そのペヌスで開発を続けるためにあらゆる努力を払い、゚ラヌは毎週修正されたす。



私たちのコミュニティは、倚くの有甚な゚ラヌメッセヌゞを提䟛するこずにより、非垞に貎重な支揎を提䟛しおきたした。 IL2CPPの継続的な改善に圹立぀すべおのレビュヌに぀いお、ナヌザヌに非垞に感謝しおいたす。



IL2CPP開発者にずっおは、テストが最初になりたす。 私たちはしばしば、テストを通じお開発技術を基瀎ずしおおり、コヌドが完党にテストされおいない堎合、含めるリク゚ストを送信するこずはほずんどありたせん。 この戊略は、明確な入力ず出力があるIL2CPPのようなテクノロゞヌに適しおいたす。 ぀たり、発生する゚ラヌの倧郚分は、予期しないシステム動䜜よりもむしろ特殊なケヌスです たずえば 、64ビットIntPtrを32ビット配列むンデックスずしお䜿甚するず、C ++コンパむラ゚ラヌが発生する堎合がありたす。 したがっお、バグをすばやく特定しお修正できたす。

コミュニティの支揎により、IL2CPPの安定性ず生産性を垞に向䞊させおいたす。



続く

次の蚘事に頻繁に蚀及するのは怖いです。 たくさん䌝えたいのですが、1぀の投皿には収たりたせん。 次回は、il2cpp.exeによっお生成されたコヌドを詳しく調べ、C ++コンパむラの動䜜に぀いお説明したす。



All Articles