huatuo 现已改名 HybridCLR, 而原来的huatuo仓库由途游接着维护
本文章主要以HybridCLR仓库为例说明:focus creative games(代码哲学) · GitHub
hybridclr 仓库为核心仓库
il2cpp_plus 仓库为改造过的il2cpp仓库添加解释核心仓库的代码指令
hybridclr_trial 仓库为示例仓库
在此之前,我们先了解下Unity的发展:
综上所了解, Unity独自开发出了一条新技术路线就是所谓的 IL2CPP,根据官方的实验数据,换成IL2CPP以后,程序的运行效率有了1.5-2.0倍的提升;
详细介绍参考: Unity将来时:IL2CPP是什么? - 知乎
这里主要说两个知识点:
这时候肯定说这个有什么关联吗?.net是一个程序开发、运行平台,它是CLI的实现,它是要实现让程序源跨语言开发软件、让开发出来的软件跨平台 、跨系统运行。 我画张图就懂其中的道道了
所以说,.net帮我们把在Unity中开发的C#代码转为符合IL字节码就可以在.net上运行;
那么IL2CPP与上有什么区别呢?
IL2CPP在得到中间语言IL字节码后,使用IL2CPP将他们重新变为静态的编译型语言(C语言,C++语言)的C++代码,然后再由各个平台(xcode,android ndk, windows visual studio等)的C++编译器来编译我们的代码,把我们的代码编程本地的机器指令,直接在os上执行,那么效率上来看肯定比在.net解释执行嘎嘎的快了;
IL2CPP只支持AOT方式,Mono支持AOT,JIT所有方式;
Android平台支持Mono和IL2CPP的所有编译方式;
IOS只支持Mono的Full AOT模式和IL2CPP;
那么什么是AOT呢?
AOT: Ahead of time 离线编译
就是把我们的高级语言➡静态编译型语言➡直接编译成二进制机器指令;
C#作为高级语言包含了GC垃圾回收, 语法特性, 线程等服务,而 c++不提供语言层面的GC垃圾回收,那又引入了一个新的知识点IL2CPP VM;
IL2CPP VM: IL2CPP的虚拟机,个人理解是一个运行库,提供一些服务:GC垃圾回收等,利用IL2CPP编写一些库,来提供这些服务;
最终可以得出一个公式:
Unity IL2CPP = IL2CPP编译出来的二进制指令+IL2CPP vm(GC,Thread等)
目前市面上主流的热更新方案:
内置虚拟机什么意思?
自己解释执行的一个运行环境,无法直接继承Monobehaviour需要自定义封一层:跨域访问,接口导出都需要开发者自己来处理,都是一件很繁琐的事情,不符合我们标准的Unity开发(拖,拉,拽,哈哈)
HybridCLR到底做了什么事情
IL2CPP runtime环境(IL2CPP VM)编写了一个解释器,解释执行IL代码指令 + 使用的是AOT的数据内存对象
我们对比下IL2CPP和HybridCLR区别
假设: 我们先定义一个struct GameObject数据内存:
C/C++代码
AddName(GameObject go){
string a = "test";
return a + go.ToString();
}
IL代码
AddName(GameObject go){
string a = "test";
return a + go.ToString();
}
HybridCLR代码
Extra_AddName_ILFunc(GameObject obj){
加载到IL指令:
{
定义一个string类型的变量a;
返回 a + obj.ToString();;
}
}
得出:
IL2CPP = 数据内存(GameObject) + 代码逻辑(二进制机器指令);
HybridCLR = 数据内存(GameObject) + 代码逻指(二进制机器指令) + IL代码指令解释执行
这就是在HybridCLR热更的项目中,我们可以随意的继承使用我们GameObject,Monobehaviour;
因为这些数据对象在编译AOT的时候,这些类型全部编译进去了;
解释执行IL的new GameObiect 和 new AOT的GameObiect对象是一摸一样的;
快速上手 | Focus Creative GamesFocus Creative Games是一个业内领先的专注于提供游戏行业深度技术解决方案的创新型公司。https://focus-creative-games.github.io/hybridclr/start_up/开发环境准备:
HybridCLR环境准备:
hybridclr 核心仓库, IL代码指令解释执行
il2cpp_plus il2cpp补丁仓库,不含核心代码是核心代码运行的必要环境
hybridclr_trial 仓库为示例仓库
FAQ:
常见错误 | Focus Creative GamesFocus Creative Games是一个业内领先的专注于提供游戏行业深度技术解决方案的创新型公司。https://focus-creative-games.github.io/hybridclr/common_errors/#currently-selected-scripting-backend-il2cpp-is-not-installed性能报告
https://focus-creative-games.github.io/hybridclr/benchmark/https://focus-creative-games.github.io/hybridclr/benchmark/
有兴趣的小伙伴可以关注一波
o(* ̄▽ ̄*)ブ