用Unity做游戏,你需要深入了解下IL2CPP

来源:互联网 发布:香港中老年人奶粉知乎 编辑:程序博客网 时间:2024/06/05 03:12

这次我们翻译了一篇Unity官方博客上的文章,原文题目为AN INTRODUCTION TO IL2CPP INTERNALS ,作者是从事Unity软件开发的Joshua Peterson。文章的看点在于,它是以IL2CPP内部开发人员的角度来讲述的,所以对于开发者来说非常有参考价值。

如果你对Mono,IL2CPP等一系列概念不甚了解,可以查看我们以前发过的这篇和这篇文章

AN INTRODUCTION TO IL2CPP INTERNALS作者:Joshua Peterson翻译:@Xu Bowie

大约在一年以前,我们写了一篇博客讨论Unity中脚本将来会是个什么样子,在那篇博客中我们提到了崭新的IL2CPP后端,并许诺其会为Unity带来更高效和更适合于各个平台的虚拟机。在2015年的一月份,我们正式发布了第一个使用IL2CPP的平台:iOS 64-bit。而随着Unity 5的发布,又带给大家另一个使用IL2CPP的平台:WebGL。感谢我们社区中用户的大量宝贵的反馈,我们在接下来的时间里根据这些反馈得以更新IL2CPP,发布补丁版本,从而持续的改进IL2CPP的编译器和运行时库。

我们没有停止改进IL2CPP的打算,但是在目前这个时间点上,我们觉得可以回过头来抽出点时间告诉大家一些IL2CPP的内部工作机制。在接下来的几个月的时间里,我们打算对以下话题(或者还有其他未列出的话题)进行讨论,来做一个IL2CPP深入讲解系列。目前准备讨论的话题有:

1.基础 - 工具链和命令行参数(本篇博文)
2.IL2CPP生成代码介绍
3.IL2CPP生成代码调试小窍门
4.方法调用介绍(一般方法调用和虚方法调用等)
5.通用代码共享的实现
6.P/invoke(Platform Invocation Service)对于类型(types)和方法(methods)的封装
7.垃圾回收器的集成
8.测试框架(Testing frameworks)及其使用

为了能让这个系列的讨论成为可能,我们会涉及到一些将来肯定会进行改动的IL2CPP的实现细节。但这也没有关系,通过这些讨论,我们希望能给大家提供一些有用和有趣的信息。

什么是IL2CPP?

从技术层面上来说,我们说的IL2CPP包含了两部分:一个进行 预先编译(译注:ahead-of-time,又叫AOT,以下一律使用AOT缩写)的编译器。

一个支持虚拟机的运行时库

AOT编译器将由.NET 输出的中间语言(IL)代码生成为C++代码。运行时库则提供诸如垃圾回收,与平台无关的线程,IO以及内部调用(C++原生代码直接访问托管代码结构)这样的服务和抽象层。

AOT编译器

IL2CPP AOT编译器实际的执行文件是il2cpp.exe。在Windows平台你可以在Unity安装路径的Editor\Data\il2cpp目录下找到。对于OSX平台,它位于Unity安装路径的Contents/Frameworks/il2cpp/build目录内。 il2cpp.exe这个工具是一个托管代码可执行文件,其完全由C#写成。在开发IL2CPP的过程中,我们同时使用.NET和Mono编译器对其进行编译。

il2cpp 接受来自Unity自带的或者由Mono编译器产生的托管程序集,将这些程序集转换成C++代码。这些转换出的C++代码最终由部署目标平台上的C++编译器进行编译。

你可以参照下图理解IL2CPP工具链的作用:
这里写图片描述

IL2CPP没做的事情

我想指出IL2CPP有一项挑战我们没有接受,而且我们也高兴我们忽略了它。我们没有尝试重写整个C#标准库。当你使用IL2CPP后端构建Unity项目的时候,所有在mscorlib.dll,System.dll等中的C#标准库和原来使用Mono编译时候的一模一样。

我们可以依赖健壮的且久经考验的C#标准库,所以当处理有关IL2CPP的bug的时候,我们可以很肯定的说问题出在AOT编译器或者运行时库这两个地方而不是在其他地方。

我们如何开发,测试,发布IL2CPP

自从我们在一月份的4.6.1 p5版本中首次引入IL2CPP以来,我们已经连续发布了6个Unity版本和7个补丁(Unity版本号跨越4.6和5.0)。在这些发布中我们修正了超过100个bug。

为了确保持续的改进得以实施,我们内部只保留一份最新的开发代码在主干分之(trunk branch)上,在发布各个版本之前,我们会将IL2CPP的改动挂到一个特定的分之下,然后进行测试,确保所有的bug已经正确的修正了。我们的QA和维护工作组为此付出了惊人的努力才得以保证发布版本的快速迭代。(译注:感觉是版本管理的标准的开发流程)

提供高质量Bug的用户社区被证明是一个无价之宝。我们非常感谢用户的反馈来帮助我们改进IL2CPP,并且希望这类反馈越多越好。

我们的IL2CPP研发组有很强烈的“测试优先”意识。我们时常使用“Test Driven Design”方法,在没有进行足够全面的测试的情况下,几乎不会进行代码的合并工作。这个策略用在IL2CPP项目上非常的棒。我们现在所面对的大部分bug并不是意想不到的行为产生的,而是由意想不到的特殊情况产生的。(例如在一个32位的索引数组中使用了64位的指针从而导致C++编译器失败)面对这种类型的bug我们可以快速的并且很自信的进行修正。

有了社区的帮助,我们非常努力的让IL2CPP既快又稳定。顺便说一句,如果你对我刚才说的这些有兴趣,我们正在招人(嗯…..我只是这么一说)

好戏连台

关于IL2CPP我们还有很多可以说的。下一次我们会深入到il2cpp.exe代码生成的细节中。看看对于C++编译器来说,由il2cpp.exe生成的代码会是个什么样子。

参考:
https://zhuanlan.zhihu.com/p/20029506?columnSlug=indieace

0 0
原创粉丝点击