新技术之IL2CPP
最近,我们谈到了Unity 的WebGL 。 在那篇文中我们简要谈论到脚本在 WebGL 中的运行的新技术称为“IL2CPP” 。然而IL2CPP 所代表的不只是适用于WebGL 的脚本解决方案,同时也是我们自己为了在更多平台上执行 .NET时能有高效能的方案。
Unity 中脚本的现状
在深入探究未来之前,让我们先谈谈现在吧。
我们利用Mono (以及在 Windows Store App 和Windows Phone 上的WinRT )让C#变得容易使用,存取第三方资料库并最接近原生平台的效能。但是仍然有些挑战必须要解决:
• C# 运行时效能仍不如C/C++
• Unity 的当前版本Mono 不支援最新的.NET版本功能。
•同时要维持约 23 个平台转换结构,在移植、维护以及保证功能与效能都达到最好需要投入大量精神。
•执行时,垃圾回收可能会导致暂停。
在过去几年中我们试图解决这些问题,但是进展不大。 同时针对WebGL 支援脚本的研究开始。 随着这两项研究的深入,我们将这两条路径合二为一。
问题范围明确,我们为了解决这问题尝试了各种不同实验。有些方法有希望解决问题,有些则否。最终我们发现了一个创新的解决方案,这正确方向就是 IL2CPP 。
IL2CPP: 简单介绍
IL2CPP 由两部分组成: 一个预先编译器( Ahead of Time (AOT) compiler) 和一台虚拟机( Virtual Machine (VM) )。
这两部分意味着我们对通用语言基础结构( Common Language Infrastructure) 的实现,类似于.NET 或Mono 。 它与Unity 中目前的脚本相容。
从根本上来说它不同于及时编译,因为IL2CPP 编译器会将程式转换成C++ 源始码,然后再利用标准 C++ 编译器来产生原生二进制文件。
在执行时也会把 IL2CPP 虚拟机所提供的其它服务带过去(如GC 、中继资料、平台资源)。
IL2CPP 的优势
我们再来谈谈前面所提到的每个问题,看看IL2CPP 如何一一解决。
性能
IL2CPP会在基于 C# 的易用性和高效性的同时,带来C++ 的卓越性能。
目前有效率的脚本工作流保持不变,同时提升性能。 我们已经测试过在一些脚本很多的程式中性能提升了2 至3 倍。这种性能提升要归功于几个因素。
• C++ 编译器和连结器提供了大量之前没有的进阶优化功能。
• 静态分析是用于优化大小和速度的程式上执行的。
• 以Unity 为中心的脚本执行时优化。
虽然IL2CPP 还处于发展阶段,但初期的测试已经可预期未来的发展很棒。
.NET 升级
我们经常收到希望我们升级.NET版本的请求。 尽管.NET 在过去几年取得了一些进步,Unity 对C # 编译器和类别库目前仍支持.NET 2.0/3.5 时代的功能。 许多用户要求要把新功能加入好让他们的程式和第三方资源库使用。
随着IL2CPP 的日益成熟,我们会将升级 Mono C# 编译器、类别库和编辑器(由于版本开发快速取代,编辑器不会转换到IL2CPP )到最新版本。 这将为Unity 带来一个现代版的.NET 。
同样值得一提的是,我们正与微软合作将现有和未来的.NET 功能放入Unity ,以确保相容性和效能。
可移植性和维护
虽然这个部分听起来像是一个应由Unity 处理的问题,但它也会对开发者产生影响。Mono 虚拟机拥有大量的平台和结构相关的程式码。 当我们把Unity发布到一个新的平台时,我们将为该平台投入大量的精力来移植和维护Mono 虚拟机。
不同的功能(以及Bug)可能存在于不同平台。 这将会影响到Unity想要为开发者创造的价值,就是我们希望开发者可以轻松地将相同内容部署到不同平台。
IL2CPP 以多种方式解决这些问题:
• 所有的程式都改为转换 C++ ,而非结构不同机器的代码。 移植和维护所产生的成本就可以得到更清楚的数据。
•新功能开发和Bug维护的速度会更快。 对我们而言,本来要花几天时间处理不同平台的结构转换变为花数分钟更改C++转换流程。 功能及Bug修复可立即用于所有平台。
照目前情况来看,如果支援IL2CPP可以在很短的时间内移植到新平台。
此外,统一化编译器的性能优化绝对远远优于一个一个维护不同的程式转换器。 这使我们能够重复利用已经导入 C++ 编译器的功能,而不需要重新做一个。
垃圾回收
IL2CPP 并没有连接任何一个垃圾回收器,而是开了一个API接口。 目前的版本中,IL2CPP 使用的是libgc 的升级版。除了GC 本身,我们也正在研究通过IL2CPP 编译器中完成的分析来减少GC 压力。
虽然此刻只有这些资料与开发者分享,但研究仍在持续在进行。 我们知道会有很多人关心这个发展,所以我们不会松懈并会保持提供最新消息。
与IL2CPP 无关,但偷偷地透露在垃圾回收的情况,Unity 5 .x 将会有越来越多无需分配的API 。
什么是IL2CPP不做的?
IL2CPP 并不是对整个.NET 或Mono 工具进行重新改写。我们将继续使用Mono C# 编译器(之后可能还会用到Roslyn )。 也会继续使用Mono 类别库。 目前对Mono 预编译器有效的所有功能和第三方资源库也会对IL2CPP相容。我们只是尝试提供一个虚拟机和预编译器的替代产品,我们还将继续利用性能卓越的Mono专案。
何时才能体验IL2CPP ?
现在我们希望您也像我们一样,对即将来临的 IL2CPP 感到兴奋,迫切地想知道何时才能使用 IL2CPP !
IL2CPP 的最初版本将在 Unity 5 中WebGL 发布的部分看到。
除了WebGL 之外,我们还在继续为Unity其他发布平台开发IL2CPP 。 事实上,我们已经在许多我们支援的平台上进行了一些工作。 预计将在年末至少再推出一个平台。 目前的计划是让iOS 成为下一个载有IL2CPP 支持的平台。
等到IL2CPP 可在多个平台上使用并且成熟之时,计划的Mono 工具升级将会接踵而来。
有一个平台永远不会受IL2CPP 支援,那就是WebPlayer,这是因为安全隐忧。 所以如前面所提的,Webplayer编译器仍将继续使用Mono 。
现在就可以看到IL2CPP执行时的效果。我们之前发布的两个WebGL Demo就是支援了 IL2CPP 。
接下来?
我们仍在为IL2CPP 埋头苦干的实现新功能、优化程式转换、修复漏洞并支援更多平台。 随着发展我们将继续发布更多官方消息与您分享。
资料
转自(墙外):Unity 脚本的未来发展