unity跨平台java开发 unity3d的跨平台特色?

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的优点是短小精悍。


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空