战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

    由于书写习惯,现在项目里依然使用我原来习惯的头文件定义协议结构体的方式:

struct EnterLobbyREQ : public ProtocolHeader

{

        char mSessionID[64];

}

这种写法比较传统,有以下优点:

  1. 确实叫协议,带头文件,如果协议有修改,客户端和服务器代码马上能看得出来
  2. 可以在结构体里添加一些自动填充size,type等的构造函数和一些自动计算变长包大小的函数,减少拷贝代码出现的错误
  3. 书写直观,初学者容易理解

但也有以下缺点:

  1. 一个修改可能导致全盘重编
  2. 发送复杂结构的数据不灵活:

    如果只想发送10-20个成员的结构体里的7,8个成员,就需要写很多的赋值表达式,而且这样的代码充斥整个工程

 

    比较流行的写法就是流式写包,在有些工程里叫ProtocolComposer

void Foo (ProtocolComposer& composer)

{

        composer << pos << action ;

}

    其优点显而易见:

  1. 协议可以只是一些注释,客户端和服务器只需要约定俗成就可以,修改协议无需重编
  2. 可以在复杂结构中自由构造发包内容,拷贝复制方便自如
  3. 自由制作变长包及类型决定包内容种类等

 

但其缺点也是有的:

  1. 一端修改协议后,另外一端若不及时修改,在编译期将无法发现,如果最后在运行期暂时没有报错,将形成bug
  2. 组包速度慢于前者,对C++类型的代码支持较好,但是c方式接受较为麻烦

 

总的来说,后者还是为很多项目所用,所以下一个项目将启用后者进行编写,希望能得到更好的游戏逻辑编写体验。如果有更好的建议可以回复。

posted on 2009-05-06 23:54 战魂小筑 阅读(1426) 评论(0)  编辑 收藏 引用 所属分类: 网络 服务器技术

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理