xlua接入protobuf

xlua接入protobuf

https://blog.csdn.net/yupu56/article/details/101543914

xlua接入protobuf
4种实现方式

1.pbc
2.protoc-gen-lua
3.sproto
4.lua-protobuf
这四种方式有什么区别呢?

1.pbc:它是云风大神早期的一个对protobuf的解析库,相对于protobuf_lua_gen来说,不需要生成巨多的lua协议描述文件,可以直接读取protobuf官方代码编译出来的protoc.exe生成的pb二进制文件,简洁效率还高。但是现在已经不维护了,并且数据只解析一层。
2.protoc-gen-lua:前网易员工,云风前同事实现,也比较早了,会给每一个.proto文件生成一个.lua协议描述文件,使用起来也需要找到对应的lua协议表名,先new,然后再序列化为字符串local msg = login:SerializeToString()。用起来没有pbc简洁,和pbc一样都不再维护了,且都不支持最新的lua和protobuf版本,
3.sproto:也是云风大神实现的,号称比pbc包小、效率高效。因为这是大神自己创建出来的协议格式,不是protobuf的解析库。所以目前使用的人较少,我也没有使用过。
4.lua-protobuf:这个是我推荐使用,并且目前也在使用的版本,使用方法和pbc基本一样,生成pb二进制描述文件,然后引入后就直接使用,解析原理虽然和pbc不一样,但是使用起来完全一样,主要是一致在维护更新,支持最新的lua和protobuf,并且效率也很高,数据解析也是多层的普通表,pbc是代理表,惰性解析。目前xlua作者也推荐使用lua-protobuf,pbc也支持,
参考资料

xLua官方:https://github.com/Tencent/xLua
xLua集成第三方库官方教程:https://github.com/chexiongsheng/build_xlua_with_libs
lua-protobuf:https://github.com/starwing/lua-protobuf
tolua使用protobuf:http://doc.ulua.org/article/ngui/simpleframework_base4.html
ulua-pbc:https://www.jianshu.com/p/c707166d80c5
xLua集成lua-protobuf:https://blog.csdn.net/iningwei/article/details/86631992

接下来讲一下,集成protobuf-lua到xlua框架中
win环境要求

    cmake(需要配置好环境变量)
    C/C++编译环境(使用visual studio-installer,安装“c++桌面开发”相关)
    在这里插入图片描述

集成过程

build_xlua_with_libs内的CMakeLists已经配置好了ffi,lpeg,rapidjson,lua-protobuf。且支持pdc。
根据车大神的文档添加或者删除对应的库文件就OK
版本同步

这一步还是蛮重要,因为版本不同步,你就是打成功了,在unity也运行不了,因为xlua的运行脚本被xlua.dll动态库需要保持版本同步。
为了和xLua版本同步,建议先把https://github.com/Tencent/xLua/tree/master/build下的除CMakeLists.txt之外的文件目录,覆盖到https://github.com/chexiongsheng/build_xlua_with_libs/tree/master/build目录。
自动编译

    使用Windows机器,可以编译Win平台和Android平台的库。

window平台库编译(需要cmake/C++环境配置好)
双击make_win64_lua53.bat,
生成build64目录和plugin_lua53目录,xlua.dll就在plugin_lua53下

android平台编译(需要JDK,SDK,NDK环境配置好)
双击make_android_lua53.bat,或者mac下执行make_android_lua53.sh
生成build_android_x86和build_v7a文件,以及在plugin_lua53下生成libxlua.so

    mac机器上,可以编译ios,android和mac平台的库

macos平台编译 (需要cmake和xcode环境)
ios和mac平台编译
在macos系统上,chmod 777 make_ios_lua53.sh
然后执行 ./make_ios_lua53.sh

android平台编译(需要JDK,SDK,NDK环境配置好)
执行make_android_lua53.sh
生成build_android_x86和build_v7a文件,以及在plugin_lua53下生成libxlua.so
C#侧集成

所有lua的C扩展库都会提供个luaopen_xxx的函数,xxx是动态库的名字,比如lua-rapidjson库该函数是luaopen_rapidjson,这类函数由lua虚拟机在加载动态库时自动调用,而在手机平台,由于ios的限制我们加载不了动态库,而是直接编译进进程里头。

为此,XLua提供了一个API来替代这功能(LuaEnv的成员方法):

    public void AddBuildin(string name, LuaCSFunction initer)

    1

参数:

    name:buildin模块的名字,require时输入的参数;
    initer:初始化函数,原型是这样的public delegate int lua_CSFunction(IntPtr L),必须是静态函数,
    而且带MonoPInvokeCallbackAttribute属性修饰,这个api会检查这两个条件。

    1
    2
    3

下main扩展LuaDLL.Lua类,用pinvoke把luaopen_pb导出到C#,然后写一个符合lua_CSFunction定义的静态函数,你可以在里头做写初始化工作,比如luaopen_pb的调用,以下是完整代码:

    namespace LuaDLL
    {
        public partial class Lua
        {
            [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
            public static extern int luaopen_protobuf_c(System.IntPtr L);
    
            [MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
            public static int LoadProtobufC(System.IntPtr L)
            {
                return luaopen_protobuf_c(L);
            }
    
            [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
            public static extern int luaopen_pb(System.IntPtr L);
    
            [MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
            public static int LoadPb(System.IntPtr L)
            {
                return luaopen_pb(L);
                }
            }
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

然后在游戏开始前,调用AddBuildin:

    luaEnv.AddBuildin("pb", XLua.LuaDLL.Lua.LoadPb);

    1

然后就ok了,在lua代码中试试该扩展:

-- 加载pb文件
local pb = require "pb"
assert(pb.loadfile "login.pb")

-- 定义表数据
local data = {
    username="666",
    password="777",
}

-- 序列化
-- encode lua table data into binary format in lua string and return
local bytes = assert(pb.encode("login.req_login", data))
print(pb.tohex(bytes))


-- 反序列化
-- and decode the binary data back into lua table
local data2 = assert(pb.decode("login.req_login", bytes))
print(data2.username)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    希望这篇文章能够对你有所帮助
————————————————
版权声明:本文为CSDN博主「PassionY」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yupu56/article/details/101543914

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值