1.Unity的跨平台原理
首先说到Unity的跨平台。Unity的跨平台是基于Mono实现的,在Windows上,.NetFramework提供了VS的编译器,将C#代码编译为CIL的代码指令集(中间码),然后通过CLR将中间码变为机器码执行。CIL是一种可以在任何支持CLI(Common Language Infrastructure 公共语言基础设施)的环境中运行。而Mono则是重写了.NetFramework在Windows上的CLR,构建了基于各个平台的不同的虚拟机,这些虚拟机的工作就是在这些不同的平台上,将CIL Code编译为机器码放在内存中供系统执行。
2.Unity3D为何可以热更新
上面说到Mono提供了各平台的虚拟机来把CIL编译为native Code机器码,其实也就是二进制码。同时它提供了三种编译方式,不同于我们熟知的AOT(ahead of time 编译执行)和JIT(just in time 解释执行),这两种编译方式上一篇C#的编译里有提。第一种是JIT,和我们熟知的一样,就是在运行时将CIL转换为native code。第二种是AOT,但是这个AOT并不是完全的静态编译,该模式在编译了大部分通常在运行时编译的CIL码,而还有一小部分还是通过JIT模式。第三章Full_AOT才是完全的静态编译,把全部CIL字节码都生成native code,运行时不再依赖JIT。
JIT模式能够在运行时才将CIL(通常保存在.exe和.dll文件中)编译成NativeCode,所以我们就可以 在运行前将CIL字节码进行替换,就达到所谓的热更新了。
3.为何在IOS不能够进行热更
因为绝大多数平台Unity3D都是依靠JIT模式进行热更。而在IOS平台上JIT模式被变相的禁止了,到底是怎么禁止的呢?其实就是因为,JIT将CIL编译为NativeCode的时候,需要开辟一段内存空间,需要这段内存空间可读、可写、可执行,然后把nativeCode(机器码)放入,修改CPU指令指针寄存器中的地址让CPU执行这段机器码。
然而在ios上,它为了保证安全问题,禁止了用户具有可执行权限的空间,这就相当于直接要求我们必须用Full_AOT的模式进行静态的编译,而这种静态的编译就无法做到对CIL指令集在运行期间的更改了,因为它早已经全部编译完成。
4.为何Lua语言可以热更
lua语言是解释型语言,如果它的解释原理和C#相同编译成中间码然后再编译成机器码的话,那肯定也不能再ios上解释执行。但是Lua使用C语言编写的脚本语言,C语言在运行时读入Lua编写的代码,编译成C代码而不是机器码,不用开辟特殊的内存空间,执行它的是用C代码写出来的虚拟机,这个C#机制完全不同。
总结
lua是一种基于已经存在的某种语言的一种新语言,这也是脚本语言和C#、C++这种语言的本质区别。当然Lua的虚拟机不单单可以用C写,也可以用C#写,热更也不一定要用lua,python也可以,但是lua的优点是短小精悍。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删