如何评价腾讯在Unity下的xLua(开源)热更方案?
关注者
1,491被浏览
355,996登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏
xLua的作者,关注这帖子一阵子了,一直犹豫作为作者回答这问题会不会有卖瓜之嫌。
回下大家关注的热补丁的overhead。
热补丁的基本原理其实非常简单,了解后任何程序员都很容易分析出开销,比如对于这个类
public class Calc
{
int Add(int a, int b)
{
return a + b
}
}
打了hotfix标签后,xLua会在il层面注入代码,注入之后这个类会类似这样:
public class Calc
{
static Func<object, int, int, int> hotfix_Add = null;
int Add(int a, int b)
{
if (hotfix_Add != null) return hotfix_Add(this, a, b);
return a + b
}
}
如果lua中执行了hotfix调用,hotfix_Add会指向一个lua的适配函数。
性能开销:
如果不打补丁,就一个if判断,比注入前多执行两条很轻量级的指令(Ldsfld,Brfalse),我在window下测试,这两指令加起来仅相当于空函数调用开销的十分之一到五分之一。
内存开销:
每个函数会多一个静态delegate引用,注意是静态的,和对象实例个数无关。(Stateful方式会略不同,后面单独分析)。
安装包影响:
一般情况,就一个if和delegate调用。如果泛化函数以及参数含非public类型参数或返回值的函数会多一点:每一个输入参数,每个输出参数,对应一次函数调用,外加三次函数调用。
很难有“增加百分之多少”的数据,因为这和你程序函数的粒度有关。有童鞋在尝试为NGUI全部类型加Hotfix标签来测试,有数据我可以更新上来。
Stateful方式
这个方式的开销和基本和Stateless一样,一个地方除外:内存开销上每个对象实例会增加一个LuaTable的引用(引用而已,不会帮你new一个LuaTable实例,你没在构造函数那返回一个table,这个引用为空)。
关于开源
当然,这决策来自领导,但我个人也有点小想法:
xLua在内部推广使用的过程中,深感项目的挑剔、指责和各种场景下的折腾才是一个通用组件快速进步和完善的动力。开源,无疑是把这放大化,也更加有利于xLua的健康发展。