slua与ulua对比

slua与tolua的对比

说明 : 两者对比,表现好的一方为5分,表现差的一方对照给出相应分数。平手用’-‘表示

对比项 slua ulua
性能 3 5
导出功能 5 4
周边支持 2 5
错误提示 - -
api易用性 - -

下面是详细说明

slua

1. C#调用lua

LuaState luaState = new LuaState(); //新建luaState
luaState.doFile("脚本路径");//加载脚本
LuaTable t = luaState.getFunction("函数名").call(...)//运行函数
t["字段名"] = "字段值" //操作table

2. 导出C#/C到lua的几种方式

  • Unity3d api使用反射方式导出。除了下面黑名单禁止的类型外全部导出
  • 黑白名单
        public static void OnGetUseList(out List<string> list)
        {
            list = new List<string>
            {
                //"UnityEngine.GameObject",
            };
        }
        public static void OnGetNoUseList(out List<string> list)
        {
            list = new List<string>
        {      
            "HideInInspector",
            //...
        };
  • 属性标记
        [CustomLuaClass]
        public class SomeClass
        {
        //...
        }

3. 特殊数据类型的导出

  • 容器

    • 实现了LuaArray,导出C#数组到lua。实现了数组到lua table的转换方法
    • 使用生成导出代码的方式,导出了List,Dictionary
    • 其他容器类型需要使用第二节所述方法导出,或者使用动态反射的方式处理
  • 委托

    • 传入C#的lua回调函数,会在lua里记录引用,防止回收。在C#对象销毁时,会释放lua里的引用
    • 每种使用到的委托类型,会生成一份导出代码,来自动处理委托参数的转化
  • 协程


ToLua

1. C#调用lua

api基本与slua一致,略

2. 导出C#/C到lua的方式

  • 导出类型列表 :统一在customTypeList里边定义要导出的Unity3d类型或者自定义类型

3. 特殊数据类型的导出

  • 实现了Array、String、Object、Type等C#类型的导出,方便在lua中操作这些类型
  • Dictionary等类型需要在lua中操作的话,需使用第二节所述方式导出,或者使用静态反射方式操作
  • 委托 : 靠代码生成的方式处理lua函数和委托函数的转化
  • 协程

其他对比点

  • 值类型处理
    • Unity3d中常用的值类型,如VectorX, Color, Quaternion,slua和tolua均在lua里实现了这些类型。对lua中的运算带来效率上的提升
  • 对重载函数调用错误的保护
    • slua会在lua代码里使用asset进行保护
    • tolua会在C#代码里抛出lua异常
    • tolua的方式效率更高
    • 错误提示上,经测试slua和tolua没有区别
  • lua/C#异常的处理 : slua和tolua均有比较完备的错误提示
  • 反射处理
    • slua对于未预先导出的类型,使用动态反射进行处理,不需要额外编码。但是也坦言动态反射对一些情况支持的不好
      • 比如对函数参数为自定义类型的匹配检查是不完整的
      • 比如对子类方法覆盖基类同名但参数类型不同的方法的匹配是有问题的
      • …很多其他的未知问题
    • tolua不支持动态反射,允许开发者使用静态反射对未导出类型进行操作
        local t = typeof('TestExport')        
        local func = tolua.getmethod(t, 'TestReflection')           
        func:Call()  
  • 性能测试 : 测试结果看来,tolua占优,测试数据见附录
  • 内存占用 : 从第三方测试的结果来看,tolua占优。第三方链接见附录
  • 框架、第三方库支持
    • slua专注于lua绑定功能,会推荐一些其他开发者开发的集成框架和第三方库
    • tolua有自己官方的框架,同时会集成一些第三方库(lua debugger\socket…)

附录


性能测试

  • 测试用例1 : 对GameObject.transform.position属性进行20万次赋值
    • C# 0.04 s
    • tolua 0.17~0.18 s
    • slua 0.23 s
  • 测试用例2 : 旋转GameObject20万次
    • C# 0.06 s
    • tolua 0.23 s
    • slua 0.27 s
  • 测试用例3 : 构造20万个Vector3
    • C# 0.04 s
    • tolua 0.001 s
    • slua 0.001 s
  • 测试用例4 : 构造2万个GameObject
    • C# 0.1 ~ 0.2 s
    • tolua 0.15~0.25 s
    • slua 0.2~0.3 s
  • 测试用例5 : 新建GameObject,添加获取Component,给Component赋值,重复2万次
    • C# 0.32 s
    • tolua 0.43~0.54 s
    • slua 0.5~0.8 s

第三方测试链接

https://github.com/qiankanglai/unity_lua_benchmark

你可能感兴趣的:(lua,unity)