-
-
Notifications
You must be signed in to change notification settings - Fork 705
generate_code_data
- 支持主流的游戏开发语言
- c++ (11+)
- c# (.net framework 4+. dotnet core 3+)
- java (1.6+)
- go (1.10+)
- lua (5.1+)
- js 和 typescript (3.0+)
- python (3.0+)
- erlang (18+)
- rust (1.5+)
- 其他protobuf支持语言
- 支持主流引擎和平台
- unity + c#
- unity + tolua、xlua
- unity + ILRuntime
- unity + puerts
- unity + GameFramework
- unity + ET游戏框架
- unreal + c++
- unreal + unlua
- unreal + sluaunreal
- unreal + puerts
- cocos2d-x + lua
- cocos2d-x + js
- skynet
- 微信小程序平台
- 其他家基于js的小程序平台
- 其他所有支持lua的引擎和平台
- 其他所有支持js的引擎和平台
- binary 格式。 格式紧凑,加载高效,但基本不具体可读性。推荐只用于正式发布。
- json 格式。 可读性佳。支持优雅对齐格式,也支持紧凑格式。 推荐用于服务器端,以及用于客户端开发期。
- protobuf 格式。适用于熟悉pb的开发者。
- msgpack 格式。
- lua 格式。 可读性佳。 推荐仅用于客户端脚本语言为lua的情形。
- xml 格式。
- erlang格式。 仅用于 erlang语言。
- yaml格式。
- 其他格式。很容易扩展支持。
同一种格式,为不同语言生成的数据是完全相同的。
不同语言支持的格式如下:
| language | data type |
|---|---|
| c# | binary, json |
| java | binary, json |
| go | binary, json |
| c++ | binary |
| go | binary, json |
| python | json |
| typescript | binary, json |
| rust | json |
| lua | binary, lua |
| erlang | erlang |
| protobuf | 所有 |
硬件:
Intel(R) Core i7-10700 @ 2.9G 16核
32G 内存
数据集
500个excel表
每个表有1000行比较大的记录
每个表文件大小 132k
测试结果:
| 格式 | 首次耗时 | 累积耗时 | 单个输出文件大小 | 输出文件总大小 |
|---|---|---|---|---|
| bin | 15.652 s | 797 ms | 164 K | 59.5 M |
| json | 17.746 s | 796 ms | 1.11 M | 555 M |
| lua | 17.323 s | 739 ms | 433 K | 212 M |
以luban_examples的DesignerConfigs配置为测试数据,以Projects下的csharp_Unity_bin和csharp_Unity_json项目为测试对比, 加载100遍cfg.Table。
binary格式耗时28ms,json格式耗时112ms。
加载性能大约为 4:1。
参见 luban命令行
详细文档参见上面的链接。代码生成相关的工具有三个,都在luban_examples/Tools目录下。
- Luban.Client。 Luban工具客户端
- Luban.Server。 Luban工具服务器端
- Luban.ClientServer。 Luban工具前后端一体。
对于新手简单起见,我们介绍Luban.ClientServer的用法,命令如下:
dotnet %LUBAN_CLIENT_SERVER_DLL% -j cfg -- ^
-d %ROOT_FILE% ^
--input_data_dir %INPUT_DATA_DIR% ^
--output_code_dir %OUTPUT_CODE_DIR%
--output_data_dir %OUTPUT_DIR% ^
--gen_types %GEN_TYPE% ^
-s %GROUP%其中:
- LUBAN_CLIENT_SERVER_DLL为 Luban.ClientServer.dll的路径, 可以指向 luban_examples/Tools/Luban.ClientServer/Luban.ClientServer.dll
- ROOT_FILE 为根定义文件,指向 MyConfigs/Define/__root__.xml
- INPUT_DATA_DIR 为配置数据的根目录,指向 MyConfigs/Datas
- OUTPUT_CODE_DIR 为生成代码的目录
- GEN_TYPE 为生成类型。 如果你使用unity,想生成c#代码,导出json数据,则使用 "code_cs_unity_json,data_json"
- GROUP 为导出分组。客户端则取client,服务器取server,所有则取all
更多项目类型,参见 示例项目
对于命令行的介绍参见 上面。 你的生成命令大略如下
dotnet %LUBAN_CLIENT_SERVER_DLL% -j cfg -- ^
-d %ROOT_FILE% ^
--input_data_dir %INPUT_DATA_DIR% ^
--output_code_dir %OUTPUT_CODE_DIR%
--output_data_dir %OUTPUT_DIR% ^
--gen_types "code_cs_unity_json,data_json" ^
-s client也即 --gen_types参数取 "code_cs_unity_json,data_json", -s 参数取 client
具体项目,可参见 Csharp_Unity_Json
更多项目类型,参见 示例项目
--gen_types 参数取 "code_typescript_json,data_json",-s 参数取 client
具体项目,可参见 Typescript_Unity_Puerts_Json
不同项目之间,仅仅是 --gen_types 不一样, 请从示例项目中找到与你项目匹配的项目,参考相应目录下的 gen_code.bat 即可。
取 --gen_types code_protobuf,data_protobuf 即可,参见 Protobuf_bin。 每个导出的数据文件对应Table类序列化后的内容,加载即可,以item.TbItem表为例。
var tbItem = ItemTbItem.Parser.ParseFrom(File.OpenRead("pb_datas/item_tbitem.bytes"));取 --gen_types data_msgpack 即可。 参见 MsgPack_bin
取 --gen_types code_flatbuffers,data_flatbuffers 即可,参见 Flatbuffers_bin。
可以。 以 Csharp_Unity_Json 为例。
- --gen_types code_cs_unity_json 则只生成代码
- --gen_types data_json 则只生成数据
可以。 命令行参数中添加 --use_unity_vector 选项即可。 参见示例 Csharp_Unity_bin_use_UnityEngine_Vector
可以。 添加选项 --naming_convention_bean_member none 即可。使生成的代码中的字段名与定义名相同。
支持以下代码命名风格:
- none。 无命名风格,生成的字段名和定义的名称一样
- language_recommend。即根据生成的语言不同,自动设置该语言推荐的风格。比如c#为PascalCase,java为 camelCase,python为under_scores。
- camelCalse。 即驼峰形式,生成 xxxYyyy这种风格的字段名。
- PascalCase。 即Pascal形式。生成XxxYyy这种风格的字段名。
- under_scores。 下划线形式。即生成xxx_yyy这种风格的字段名。
默认使用 language_recommend。
code_cs_json生成代码中使用了 System.Text.Json库,这个只有.net core 3以后的版本才有,unity目前的.net版本不支持,所以这是给基于.net coer的服务器项目使用的。 code_cs_unity_json使用了第三方的SimpleJson库,兼容unity的.net版本,给unity生成加载json数据的c#代码时,可以(当前也只有这个选择)选择这个。
-j选项相应的长选项名为--job,表示生成类型。由于luban目前支持消息(proto)、数据库(db)、配置(cfg) 三种类型的生成任务,这些生成任务的功能完全不同,参数 相差较大,需要用-j 来区分不同的生成任务。
可以。 __root__.xml中 topmodule 配置项对应的值即为顶层命名空间,可以调整为空或者为其他值。
数据格式的默认文件后缀如下
| data | extension |
|---|---|
| data_bin | bin |
| data_json | json |
| data_json2 | json |
| data_lua | lua |
| data_xml | xml |
| data_yaml | yml |
| data_protobuf | bp |
可以通过命令行选项"--data_file_extension xxx"手动指定输出文件的后缀。
并非所有定义的类型都会生成代码,必须满足以下规则之一:
- 被导出的table直接或者间接引用的类型
- root.xml 的 service的 ref项指定的类型。如下图,即使没有任何表直接或者间接引用到test.DemoEnum和test.DemoBean类型,它们也会在server目标时生成代码。
<service name="server" managers="Tables" group="s">
<ref name="test.DemoEnum"/>
<ref name="test.DemoBean"/>
</service>