如何评价腾讯在Unity下的xLua(开源)热更方案?

Github:Tencent/xLua Info:腾讯开源手游热更新方案,Unity3D下的Lua编程
关注者
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的健康发展。