探讨Unity3d跨平台原理

许久未在Csdn上写过东西了,打算好好把所学知识归集在此给大家交流。

今天要写的是u3d是如何实现跨平台,众所皆知U3d可以使用多种语言写脚本还可以混合使用。u3d使用的是mono这个跨平台框架,把脚本编辑成It(IL可以指Intermediate Language,同MSIL(Microsoft Intermediate Language),是将.NET代码转化为机器语言的一个中间语言的缩写). 然后分别利用JIT和AOT,

什么是JIT?

JIT是just in time,即时编译技术。使用该技术,能够加速java程序的执行速度。下面,就对该技术做个简单的讲解。

首先,我们大家都知道,通常javac将程序源代码编译,转换成java字节码,JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢。为了提高执行速度,引入了JIT技术。

在运行时JIT会把翻译过的机器码保存起来,已备下次使用,因此从理论上来说,采用该JIT技术可以,可以接近以前纯编译技术。下面我看看,JIT的工作过程。

JIT 编译过程
当JIT编译启用时(默认是启用的),JVM读入.class文件解释后,将其发给JIT编译器。

参考:http://blog.chinaunix.net/uid-9789791-id-1997450.html

AOT(ahead-of-time 编译方式),就是将 像Java编译后得到的中间语言文件 变成和系统相关的 native binary。AOT主要适用场合是,当解释器(中间语言翻译成机器语言)速度太慢,或JIT过于复杂,或JIT导致严重的滞后的情况。大多数情况下,启用了AOT以后的可执行程序,相比启用AOT之前,可以摒弃很多运行时环境的碎片(fraction of runtime environment),从而节省磁盘/内存空间,缩短启动时间。因此,AOT在嵌入式设备和移动设备中是很有用的。

这里需要注意的是在ios 上使用的是 full AOT模式而不使用JIT引擎,AOT使用的时候是有限制的。

具体可以参考MonoTouch的文档,这里提几条常见的:

  • 不支持泛型虚方法,因为对于泛型代码,Mono通过静态分析以确定要实例化的类型并生成代码,但静态分析无法确定运行时实际调用的方法(C++也因此不支持虚模版函数)。

  • 不支持对泛型类的P/Invoke。

  • 目前不能使用反射中的Property.SetInfo给非空类型赋值。

  • 值类型作为Dictionary的Key时会有问题,实际上实现了IEquatable<T>的类型都会有此问题,因为Dictionary的默认构造函数会使用EqualityComparer<TKey>.Default作为比较器,而对于实现了IEquatable<T>的类型,EqualityComparer<TKey>.Default要通过反射来实例化一个实现了IEqualityComparer<TKey>的类(可以参考EqualityComparer<T>的实现)。 解决方案是自己实现一个IEqualityComparer<TKey>,然后使用Dictionary<TKey, TValue>(IEqualityComparer<TKey>)构造器创建Dictionary实例。

  • 由于不允许动态生成代码,不允许使用System.Reflection.Emit,不允许动态创建类型。

  • 由于不允许使用System.Reflection.Emit,无法使用DLR及基于DLR的任何语言。

  • 不要混淆了Reflection.Emit和反射,所有反射的API均可用



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值