- 几个基本概念
- Mono 是什么鬼?
Mono是一个.Net工具,包括c#编译器和共通语言执行平台,可运行在winodws linux mac unix各种平台,其虚拟机包含一个实时编译引擎, Unity3d就是用mono这个东西实现跨平台的估计
-
- CIL(Common Intermediate Language通用中间语言)
CIL可以在任何支持CLI(Common Language Infrastructure,通用语言基础结构)的环境中运行,就像.NET是微软对这一标准的实现,Mono则是对CLI的又一实现。由于CIL能运行在所有支持CLI的环境中,例如刚刚提到的.NET运行时以及Mono运行时,也就是说和具体的平台或者CPU无关。这样就无需根据平台的不同而部署不同的内容了。
代码的编译分两个部分:
-
-
- 从代码本身到CIL的编译(其实之后CIL还会被编译成一种位元码,生成一个CLI assembly)
- 运行时从CIL(其实是CLI assembly,不过为了直观理解,不必纠结这种细节)到本地指令的即时编译(这就引出了为何U3D官方没有提供热更新的原因:在iOS平台中Mono无法使用JIT引擎,而是以Full AOT模式运行的,所以此处说的额即时编译不包括IOS)
-
-
- Mono的AOT?
Ahead of Time (AOT) 提前编译来减少JIT的工作量,(JIT: Just In Time Compile,即时编译器)但默认情况下AOT并不编译所有IL代码,而是在优化和JIT之间取得一个平衡。在iOS中,Mono是以Full AOT模式运行的,无法使用JIT引擎。iOS平台是禁用JIT引擎的,于是Mono在iOS上需要Full AOT编译和运行。即预先对程序集中的所有IL代码进行AOT编译生成一个本地代码映像,然后在运行时直接加载这个映像而不再使用JIT引擎。(其实严格来说,iOS没有禁止JIT,而是封锁了内存(或堆)的可执行权限,就相当于变相封锁了JIT这种编译方式)
-
- 过程总结
1. c# ---> CIL
2. CIL ---> 位元码
3. 第三步有两种形式:
---> JIT 位元码 给虚拟机执行
----> AOT 位元码 ---> 不同平台原生代码 直接平台执行
而JIT这种方式是被iOS禁止的,只能用AOT模式在运行前先编译好(当然AOT编译阶段也是用到JIT的引擎)
基本是这样
-
- 反射 && 与Mono有啥关系?
.Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息
- System.Reflection.Emit 可动态构建程序集和类型的所有框架类的根,在需要时动态的产生代码。(注意:反射发出(reflection emit)并不能产生源代码。换句话说,你在这里的努力并不能创建VB.Net或者C#代码。相反,反射发出(reflection emit)类会创建MSIL op代码。---> 即微软中间语言,类似CIL啦),然而是没有卵用的,假设你将一个可能会更新c#类放在某个DLL里面,运行时LoadDLL然后实例化出这个类使用,生成MSIL代码,但是iOS并不支持JIT,所以代码也没法用啊...
- 所以说反射的API都可以用,但是其实对于做热更新是没有意义的....大概说的就是这个意思吧(我猜测的)
- C#中的反射的主要用途有:
1. 需要访问程序元数据的属性
2.检查和实例化程序集中的类型。
3.在运行时构建新类型。
4.执行后期绑定,访问在运行时创建的类型的方法。
猜测反射就是Mono使用JIT的主要技术
- Reflection.Emit与反射?
TODO?
-
- uLua(asset store)使用的反射机制?
TODO?
-
- ulua & cstolua
静态方法,性能优越?
-
- iOS为啥不支持JIT?
No Dynamic Code Generation
Since the iPhone's kernel prevents an application from generating code dynamically Mono on the iPhone does not support any form of dynamic code generation.
至于为什么不支持,就不懂了... 反正iOS不支持,Unity3D和Mono都不会公开支持
- Unity3D与cocos2dx更新有啥不一样?
TODO?