关于热更新的理解
Unity使用的是.Net框架,前端编写C#代码(也就是写源代码)
--->编译源代码就是将源代码变成IL中间代码
--->打包前会执行IL2CPP,IL2CPP也就是IL to CPP,即将IL中间代码变为C++代码。然后再通过C++编译器(Complier)对C++代码进行编译。(C++就是编译性语言)
--->这里说的编译指的是静态编译,也就是运行前编译,也就是AOT(Ahead of Time)编译,而C++经过编译之后,变成了机器码。
--->这个时候安装到了手机,所有的代码都已经固定了,也就是说最终执行的命令已经固定下来了,所以也就不能热更了。
--->就比如说点击一个按钮A,弹出A界面。指令都已经固定下来了,最终执行的命令就是这段机器码。
照这个理论,如果说最终执行的命令,也就是机器码是在运行的时候才编译出来,那么也就实现了热更新。
那也就是说要参与到热更新的代码是不加入IL2CPP的,不进行AOT编译来变成机器码的。
也就是说最终要执行的机器码是运行时编译,也就是所谓的JIT(Just In Time)编译。
顺着这个思路下去,就涉及到了下面的热更新方案
=========第一种=====>Lua
--->Lua是一种解释性语言(相对于编译性语言)
--->在运行时,Lua代码通过Lua虚拟机来进行即时编译,执行一句,解释一句。也就是说,执行一句代码,就由Lua虚拟机将这代码编译为机器码执行。
--->而Lua是作为一种文本资源存在的,当然,也可以通过网络下载,所以可以进行热更。
=========第二种=====>ILRuntime
--->程序集生成DLL文件(也就是编译源代码并生成DLL文件),DLL文件也就是动态链接库文件。
--->.Net中的Mono.Cecil库能获取到程序集中的PE信息(DLL文件就是PE文件的一种),通过这个库能够得到DLL文件中的IL中间代码
--->这些IL代码是不会转换成C++然后AOT编译的,而是通过.Net的CLR(common language runtime),也就是公共语言运行库,来将IL代码转换为机器码。
--->而DLL文件也是作为一种资源存在的,当然,也可以通过网络下载,所以可以进行热更。
浙公网安备 33010602011771号