项目集成XLua热更新

XLua集成
因为游戏厂商都不想因为版本更新导致玩家流失,所以热更新一直是商业游戏中比较重要的需求,但很多时候,由于种种原因导致的窘境是,游戏开发工作已近完成,此时才有增加热更模块的想法。
案例:你是一名游戏程序员Jack,你的老板让你接手一个百万级源码的项目Stool,Stool没有框架设计,插件乱放,代码零碎不堪,目前只有资源更新,需要为该项目添加热更新模块,该项目之前的程序员已经离职,你该怎么做?
解决方案:
一.分析问题:XLua插件能帮助我们实现热更,但是需要把所有需要更新的类打上[Hotfix]标签,所以问题就化归成了怎么把项目中需要热更新的类都打上[Hotfix]标签,这是一个集合中求特定子集的问题,因为我们能够很容易得出整个集合,只需要System.Reflection.Assembly.Load(“Assembly-CSharp”)就能获得整个程序集assembly,让我们再转换一下,因为不需要更新的类比需要更新的类少,所以问题就变成了怎么样在assembly包含的类中剔除掉不需要更新的类,多说无益,让我们先把整个程序集的类通过assembly.GetTypes()得到并存放在一个文件file_0.txt中,这就是我们的原始文件,文件的每行都是一个完整的类名,我们要剔除掉file_0.txt文件中的杂质,来得到我们最终需要的只包含需要热更新类的文件file.txt,这是个百万级的项目,显然不是一下子就能得出正确答案的,所以我们采用递归的思想,每次都解决同样的问题,但每次问题的规模都变得更小,有了这个思路,便有了一个可行方案,让我们引入另一个文件magic.txt,该文件的内容是需要被剔除的类名,但是正如前面所说,我们不可能一次性得出答案,所以我们浏览下file_0.txt这个文件的内容,感受下名为Stool的家伙,然后我们可以很自然的把少量的需要过滤掉的东西放进magic.txt,比如Unity系统自带的类、引入的插件的类、XLua自身的类等等,一开始不要填写太多,利用magic.txt文件的内容筛选file_0.txt,然后得到file_1.txt,可以明显发现相比file_0减少了不少内容,然后继续换行,继续让magic.txt里面填写新的内容,再次使用magic.txt文件筛选file_1.txt,得到file_2.txt文件,这样在一两个小时就能完成,这个系统能够成功得出结果的保证有两个:1是容错,只要发现file_n.txt中有些需要更新的类被剔除了,说明上一次添加到magic.txt文件里的条目有问题,删除这些条目和file_n.txt文件,再次开始即可;2是积累,一开始的magic.txt内容很少,但是随后会渐渐被填充,相信我,最后magic.txt中的内容也不会太多。最后,我们会得到一个需要被剔除的类的完整列表文件magic.txt,这个文件以后也能一直使用,使用magic.txt来筛选就能一步得到file.txt,至此分析完毕。
二.解决问题:
1.下载XLua并导入项目,腾讯XLua官方github地址:https://github.com/Tencent/xLua
2.编写XLua单例类,用于启动XLua环境XLua.LuaEnv,使用luaEnv.AddLoader载入LuaPackage.lua完整路径,LuaPackage.lua文件包含所有本地或“资源更新”下来的Lua脚本(require XXX.lua),执行luaEnv.DoString(“require ‘LuaPackage’”),其他的gc等细节问题自己处理
3.添加一个静态类HotfixClass,定义一个静态成员ListhotfixClass,它里面就是用来填写所有需要热更新的类
4.UnityEditor编写筛选方法,按照之前的分析过程,通过magic.txt筛选file_n.txt,重复数次,最后得到一份带完整被剔除类的magic.txt便于以后使用,和一个只包含所有需要更新类的file.txt
5.将file.txt文件中的内容拷贝到HotfixClass中的hotfixClass成员中,完成,至于后续的[LuaCallCSharp]标签和[CSharpCallLua]标签自己根据实际情况添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值