[关闭]
@daaoling 2017-02-01T23:53:35.000000Z 字数 1532 阅读 6932

Xlua 热更新

Xlua Tolua 特性对比

每次修改c# 代码 xlua 无需生成代码, tolua 需要生成代码

原理

tolua:c# 代码静态注册到lua代码中
xlua:在编辑器模式下使用TypeBuilder,IlEmit,动态生成接口的C#代码,避免了每次新注册或者改变导入类时,都需要生成代码并加载。最后在实际发布中需要生成代码

注意点

但是需要加XLua.LuaCallCSharp or XLua.ReflectionUse(如果发布的时候没有生成代码的话)
建议所有要在Lua访问的类型,要么加LuaCallCSharp,要么加上ReflectionUse,这才能够保证在各平台都能正常运行。

结论

在实际项目中,确实经常由于未运行代码生成菜单,导致一些编译或运行错误。如果项目逻辑主要使用lua开发,并不设计到频繁的互操作的话,此问题有所缓解

xLua支持热补丁

原理

热补丁的基本原理其实非常简单,了解后任何程序员都很容易分析出开销,比如对于这个类

  1. [hotfix]
  2. public class Calc
  3. {
  4. int Add(int a, int b)
  5. {
  6. return a + b
  7. }
  8. }

打了hotfix标签后,xLua会在il层面注入代码(触发编译后),注入之后这个类会类似这样:

  1. public class Calc
  2. {
  3. static Func<object, int, int, int> hotfix_Add = null;
  4. int Add(int a, int b)
  5. {
  6. if (hotfix_Add != null) return hotfix_Add(this, a, b);
  7. return a + b
  8. }
  9. }

如果lua中执行了hotfix调用,hotfix_Add会指向一个lua的适配函数。

  1. xlua.hotfix(CS.Calc, 'Add', function(a, b)
  2. print('Update in lua')
  3. end)

复杂类型传递无GC

isssue

struce/class 映射只支持int类型

请问 hotfix 子类中重载父类的方法

  1. 父类中有个
  2. public virtual void Awake()
  3. {
  4. Debug.Log("name" + gameObject.name);
  5. }
  6. 子类中重载:
  7. public override void Awake()
  8. {
  9. base.Awake();
  10. Debug.Log("testpanel awake===");
  11. }
  12. 我在hotfix 这个子类的Awake时:
  13. xlua.hotfix(CS.TestPanel, 'Awake', function()
  14. print('<<<<<<<<Awake in lua')
  15. end)
  16. 这里,有什么办法还可以执行到父类的Awake
  17. 目前没提供。。hotfix的话,你把父类逻辑也在lua实现就可以了。
  18. 就是在hotfix的时候把父类的这个方法里面的逻辑也写到Lua里面?以后会有提供么?
  19. 想了下,貌似很难用很常规的办法提供。

是否有丰富的库

tolua 因为早期的沉淀如Luaframework这种框架 所以开发起来可以直接用而不用自己再从头弄一些轮子, 相比之下xlua精简了不少, 需要自己花费一定的时间造轮子

参考

xlua github
知乎 如何评价腾讯在Unity下的xLua(开源)热更方案?
Gad 腾讯开源手游热更新方案:Unity3D下的XLua方案介绍
Gad 腾讯开源手游热更新方案:Unity3D下的XLua技术内幕(一)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注