适用于游戏开发的协议格式、代码生成器及相关开发API
Protobuf作为行业通用的协议格式已经存在多年,各种历史遗留问题及语言设计上的缺陷对游戏开发阻碍非常大。
为了提高协议编写效率,增加协议使用灵活度,急需一套强于Protobuf的工具集提高开发效率和使用便捷性,ProtoPlus应运而生!
___ | ProtoPlus | Protobuf |
---|---|---|
生成字段Tag | 自动/手动 | 手动 |
生成枚举值 | 自动/手动 | 手动 |
注释扩展 | API简单 | API复杂 |
字段扩展 | 专属API支持 | 手动解析注释 |
结构扩展 | 专属API支持 | 手动解析注释 |
消息ID生成 | 自动/手动 | 不支持 |
路由表生成 | 支持 | 不支持 |
扩展方式 | 描述文件输出JSON | 复杂的插件格式,调试复杂 |
注:
-
ProtoPlus中的枚举值,不再需要为了兼容C++而必须加上前缀,保证全局枚举值唯一
-
ProtoPlus二进制编码格式与Protobuf一致,方便调试、分析、优化
enum Vocation {
Monkey
Monk
Pig
}
struct PhoneNumber {
number string
type int32
}
struct Person {
name string
id int32
email string
phone PhoneNumber
voc Vocation
}
struct AddressBook {
person []Person
}
描述 | ProtoPlus | Go | C# | Protobuf |
---|---|---|---|---|
32位整形 | int32 | int32 | int | int32 |
64位整形 | int64 | int64 | long | int64 |
无符号32位整形 | uint32 | uint32 | uint | uint32 |
无符号64位整形 | uint64 | uint64 | ulong | uint64 |
字符串 | string | string | string | string |
单精度浮点数 | float32 | float32 | float | float |
双精度浮点数 | float64 | float64 | double | double |
二进制数据 | bytes | []byte | byte[] | repeated byte |
枚举 | enum | int32类型常量封装 | enum | enum |
布尔 | bool | bool | bool | bool |
结构体 | struct | struct | class | message |
go get -u -v github.com/davyxu/protoplus/cmd/protoplus
命令行示例:
protoplus --ppgo_out=msg_gen.go --package=proto proto1.proto proto2.proto
参数说明:
-
ppgo_out
Go源码文件名
-
package
指定输出时的Go包名
输出源码被引用时, 自动注册到cellnet的消息Registry中
命令行示例:
protoplus --ppgoreg_out=msg_gen.go --package=proto proto1.proto proto2.proto
参数说明:
-
ppgoreg_out
Go源码文件名
-
package
指定输出时的Go包名
-
codec
生成消息注册的默认编码,如在消息中指定编码时,优先使用指定的编码
输出的C#源码, 需要配合ProtoPlus C# SDK 使用
命令行示例:
protoplus --ppcs_out=MsgGen.cs --package=Proto proto1.proto proto2.proto
参数说明:
-
ppcs_out
C#源码文件名
-
package
指定输出时的C#命名空间
-
classbase
C#代码生成时,消息类默认基类名称, 默认基类为IProtoStruct
输出的C#源码, 需要配合ProtoPlus C# SDK 使用
命令行示例:
protoplus --ppcsreg_out=MsgGen.cs --package=Proto proto1.proto proto2.proto
参数说明:
-
ppcsreg_out
C#源码文件名
-
package
指定输出时的C#命名空间
输出的Protobuf协议描述文件,可使用protoc编译器编译
命令行示例:
protoplus --pbscheme_out=pb.proto --package=proto proto1.proto proto2.proto
参数说明:
-
pbscheme_out
生成protobuf 3.0协议文件
-
package
指定输出时的Protobuf包名
ProtoPlus协议描述文件可输出为JSON格式, 方便插件及工具链获取ProtoPlus的格式信息
命令行示例:
protoplus --ppscheme_out=pp.json proto1.proto proto2.proto
参数说明:
-
ppscheme_out
JSON格式的ProtoPlus协议描述文件, 格式参见 协议描述定义
也可将描述文件的JSON直接输出,示例如下:
protoplus --ppscheme proto1.proto proto2.proto
在结构体上添加MsgDir字段,标记结构体作为消息时的消息流转方向, 格式范例:
[MsgDir: "client -> game"]
struct LoginREQ {
}
路由信息将输出为JSON格式:
{
"Rule": [
{
"MsgName": "proto.LoginREQ",
"SvcName": "game"
}
]
}
MsgDir的格式包含3个部分
MsgDir: From -> Mid -> To
-
From
消息的发起方,路由一般忽略此部分信息
-
Mid
消息的中间处理, 一般为网关或者路由等
-
To
消息的目标送达点,消息处理最终方, 一般为某种消息服务, 路由表的SvcName字段读取该字段
命令行示例:
protoplus --route_out=route.json --package=proto proto1.proto proto2.proto
参数说明:
-
route_out
JSON格式的ProtoPlus路由配置, 格式参见 路由定义
-
package
指定输出时消息的包名
也可将路由信息的JSON直接输出,示例如下:
protoplus --route --package=proto proto1.proto proto2.proto
感觉不错请star, 谢谢!