由于书写习惯,现在项目里依然使用我原来习惯的头文件定义协议结构体的方式:
struct EnterLobbyREQ : public ProtocolHeader
{
char mSessionID[64];
}
这种写法比较传统,有以下优点:
- 确实叫协议,带头文件,如果协议有修改,客户端和服务器代码马上能看得出来
- 可以在结构体里添加一些自动填充size,type等的构造函数和一些自动计算变长包大小的函数,减少拷贝代码出现的错误
- 书写直观,初学者容易理解
但也有以下缺点:
- 一个修改可能导致全盘重编
发送复杂结构的数据不灵活:
如果只想发送10-20个成员的结构体里的7,8个成员,就需要写很多的赋值表达式,而且这样的代码充斥整个工程
比较流行的写法就是流式写包,在有些工程里叫ProtocolComposer
void Foo (ProtocolComposer& composer)
{
composer << pos << action ;
}
其优点显而易见:
- 协议可以只是一些注释,客户端和服务器只需要约定俗成就可以,修改协议无需重编
- 可以在复杂结构中自由构造发包内容,拷贝复制方便自如
- 自由制作变长包及类型决定包内容种类等
但其缺点也是有的:
- 一端修改协议后,另外一端若不及时修改,在编译期将无法发现,如果最后在运行期暂时没有报错,将形成bug
- 组包速度慢于前者,对C++类型的代码支持较好,但是c方式接受较为麻烦
总的来说,后者还是为很多项目所用,所以下一个项目将启用后者进行编写,希望能得到更好的游戏逻辑编写体验。如果有更好的建议可以回复。