Unity huatuo示例项目源码分析与启发
上一节我们安装huatuo的开发环境,然后运行示例项目,体验了huatuo做热更新,这节课我们来分析示例项目的源码,掌握huatuo做热更新的主要的步骤,让你自己的项目很好的基于huatuo来组织热更新。有几个huatuo的原则要清楚:
这里有个游戏开发交流小组 大家可以领取视频教程及源码素材
- Unity ADF机制来分项目,可以分成若干项目,避免大量代码长时间的编译,同时可以按照更小的颗粒度来做热更新。
- 普通开发中,会把Unity项目的代码通过IL2CPP全部转成静态的二进制指令代码,如果当IL2CPP_huatuo加载了一个IL代码的.dll(既有AOT的静态代码,又装载了对应的IL代码),huatuo会优先解释执行装载的IL代码。每个版本都把.dll生成出来,进行比对,哪些.dll变化了,就采用il2cpp_huatuo下载下来,转载执行即可。
- 任何项目的代码(框架代码+游戏逻辑)都可以基于huatuo来做热更新。
- huatuo提供热更的机制,至于如何热更,热更哪些完全由自己控制;
我们带着这些原则来对示例项目来做源码分析得到自己开发项目中的启发。
启发1: 游戏代码如何分工程与项目
传统的我们的热更新项目会分为:框架代码+游戏逻辑。你也可以按照这个标准来划分,也可以继续分更小的颗粒度,比如游戏逻辑,可以拆分为:战斗,任务等。所以我们在使用huatuo做热更新的时候它首先做的是项目拆分,示例代码中利用Unity 的ADF机制,将项目分成了几个工程如下:
Assembly-CSharp.csproj:默认的代码工程,新建代码默认会被拉入到这个工程编译;
Assembly-CSharp-Editor.csproj:编辑器Editor代码会被拉入到这个工程编译;
BetterStreamingAssets.csproj: 示例项目中的资源ab包加载工程;
HotFix.csproj: 示例项目中测试热更的测试工程;
HotFix2.csproj: 示例项目中的第二个测试工程;
Main.csproj: 示例项目中入口主工程,示例项目从这个入口工程的代码开始运行;
这里给到我们的启发,我们在做自己游戏项目的时候,也可以根据自己的项目需求利用Unity ADF机制,来将项目划分称若干工程,而这些工程,可以单独的生成IL的.dll代码指令。这样就可以给IL2CPP_huatuo来解释执行了。由这里得到的启发,我们用huatuo做项目的时候我会将项目如下划分,供大家参考:
Assembly-CSharp.csproj:默认的代码工程,这里放启动代码,放热更新版本检测代码,检测出来哪些.dll需要更新,基于增量下载更新,比较出哪些不用更新使用原来自带的AOT内部的代码,哪些需要更新,需要更新的用il2cpp_huatuo来装载进来,优先执行装载进来的.dll指令。
Main.csproj:可以用来做框架工程,实现各个框架模块,初始化框架,进入具体游戏逻辑,提供基础的服务,如SDK服务等。这个是传统热更的框架层,一般情况下不用热更,使用AOT后的代码就可以了,如果万一要热更,也可以直接热更生成的main.dll。
若干业务逻辑项目工程: 根据游戏的类型来进行区分若干游戏项目,根据版本比对决定这些.dll是否需要被il2cpp_huatuo虚拟机装载。
启发2: 扩展编辑器来生成所有.dll
由huatuo的特性,你装载哪个.dll,就可以动态解释执行对应的.dll的代码指令。所以我们就可以得到启发,把我们项目中所有的除Assembly-CSharp.dll以外的.dll都生成出来。比如1.0版本: Main.dll(游戏框架), game.dll(游戏主逻辑), task.dll(任务系统), … 比如2.0版本: main.dll, game.dll, task.dll, …。这样每次打包发布的时候,我们就可以使用这个编辑器扩展,编译出来所有的项目中的.dll,并生成一个所有.dll的md5文件变化列表。把最新的一份.dll与md5文件列表放服务器,把本地md5文件列表放包里,每次运行,我们增量下载最新版本的.dll后,我们只要比较服务器上的.dll md5文件列表,与当前版本对应.dll的md5文件列表,决定出哪些.dll需要装载进入il2cpp_huatuo,就直接装载即可实现热更新,那些没有变化的.dll,表示可以直接使用AOT模式下的机器指令,不用热更解释执行IL指令的.dll。我们来看下示例项目里面是如何编译我们的.dll指令的,参考对应的编辑器的扩展代码。打开示例项目的Editor/Huatuo文件夹的EditorHelper.cs, 如图:
没有什么可说的,调用API,打包.dll,直接copy过来就可以了。根据我们上面的分析,对.dll生成不同版本的.dll md5文件列表这个需要自己扩展一下,示例代码中没有。
启发3: 要热更哪部分代码,就装载哪部分代码
使用huatuo做热更新最后需要掌握的一个点就是,如何装载.dll的代码,当我们知道当前系统需要装载哪些.dll让huatuo解释执行后,最后一步就是让huatuo来装载,我们从这个示例项目的代码中可以看到il2cpp_huatuo是如何装载一个.dll的,当这个.dll被装载后,这部分的功能就被解释执行了。Huatuo如何加载代码,我们可以参考示例如下(代码来自LoadDll.cs):
它分为了发布模式与Edtior模式,发布模式就是直接把.dll装载进入il2cpp_huatuo的vm中,调用API函数: System.Reflection.Assembly.Load(.dll的二进制文件内容),在底层huatuo做了修改。编辑器模式下,调用AppDomain就行装载就可以了,所以这个代码我们直接可以参考拿过来,比较出哪些.dll要热更,我就转载它就可以了。
Unity huatuo示例项目源码分析与启发相关推荐
- 开源项目源码分析(Kickstarter-iOS )(一)
开源项目源码分析(Kickstarter-iOS )(一) 1.Kickstarter开源项目简介 2. Kickstarter项目结构 2.1 Makefile 文件 2.2 Git submodu ...
- Phenotips 项目源码分析 [0]
PhenoTips™ is a software tool for collecting and analyzing phenotypic information for patients with ...
- bilibili go项目源码分析
go 项目源码 约329个Go服务, 历史约170人左右贡献过Go代码. 代码和目录规范性比较好, 代码生成工具建设比较好, 大家可以借鉴一下. 对于一个Golang开发者来说, 入职B站, 我觉得大 ...
- 【Android】Android Binder进程间通信AIDL示例与源码分析
前言 众所周知,Android进程间通信采用的是Binder机制.Binder是Android系统独有的进程间通信方式,它是采用mmp函数将进程的用户空间与内核空间的一块内存区域进行映射,免去了一次数 ...
- frostwire项目源码分析
Frostwire代码分析 Frostwire是一个基于其他许多优秀开源项目开发的一款文件分享软件.它的前身是LimeWire Gnutella客户端:但是已经有了很大的变动. 现在FrostWire ...
- 【Android Camera2】Camera2开源项目源码分析汇总
一.简介 本篇文章为综述汇总类文章,包含后续文章即将分析的使用Camera2实现的开源项目 相关文章: Android Camera系列文章目录索引汇总 Android Camera2 综述 二.开源 ...
- pion ice项目源码分析
前言 git 地址https://github.com/pion/ice ice 流程的介绍博客https://www.rongcloud.cn/blog/?p=4178 整个源码分析会直接根据ice ...
- 软件工程应用于实践:AJ-Report项目 源码分析(8)
2021SC@SDUSC 本次分析的是report-ui\src\views\report\excelreport\designer处的代码 data () {return {activeName: ...
- python有趣小项目源码分析_推荐 10 个有趣的 Python 项目
想成为一个优秀的开发者,没有捷径可走,势必要花费大量时间在键盘后. 而不断地进行各种小项目开发,可以为之后的大开发项目积攒经验,做好准备. 但不少人都在为开发什么项目而苦恼,因此,我为大家准备了10个 ...
最新文章
- c++每调用一次函数+1_每个开发人员都应该知道的一些很棒的现代C ++功能
- 【pmcaff】产品经理每日十问,问问自己,你做到了嘛
- redis开启外网访问
- 变频器输出功率_工业电气设计|变频器的输出功率该如何选择?
- 解惑烟草行业工控系统如何风险评估
- ASP.NET Core 1.1 简介
- php基础学哪些,榆林学习php需要哪些基础(PHP是什么)
- Facebook Connect Magento Extension
- 谷歌发布GPhone 创始人亲自上阵
- 通过keil hex2bin,bin2hex的方法
- 【Linux】快速入门gdb调试工具
- 数据结构(C语言版)-- 数据结构基础
- Win8.1和Win10各自的优势
- 《Java程序设计》课程代码题(九)
- 关于射频和微波PCB设计注意事项
- linux dns区域传送,DNS服务之主从复制和区域传送
- CSS实现个性化水球图
- PM、RD、FE、UE...等等这些互联网相关的缩写
- python函数的应用
- AerSale将携手Universal Avionics为空客320飞机上的ClearVisionTM增强型飞行视景系统开发STC
热门文章
- html怎么设置一条边框线,css怎么设置边框?
- 市值3万亿的facebook再出丑闻,你的数据,到底应该归谁?
- 什么是Linux主机?
- Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复
- PR/AE/FCPX比较好用的插件有哪些?
- 数学建模——Matlab画散点图
- php excel 公式,Excel函数所有公式汇总
- 许家印布局新能源汽车 恒大正式牵手柯尼塞格
- android设置加密步长,非稳态计算时Fluent 时间步长如何设置(转载)
- 光脚丫思考Vue3与实战:第04章 模板语法 第03节 指令的修饰符