加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

教你从新写游戏处事器框架

发布时间:2019-02-21 01:04:05 所属栏目:业界 来源:腾讯游戏学院
导读:1.需求 因为越通用的代码,就是越没用的代码,以是在计划之初,我就以为应该行使分层的模式来构建整个体系。凭证游戏处事器的一样平常需求分别,最根基的可以分为两层: 底层基本成果:包罗通讯、耐久化等很是通用的部门,存眷的是机能、易用性、扩展性等指标

游戏行使 UDP 协议的特点:一样平常来说 UDP 是无毗连的,可是对付游戏来说,是必定必要有明晰的客户端的,以是就不能简朴用一个 UDP socket 的fd 来代表客户端,这就造成了上层的代码无法简朴在 UDP 和 TCP 之间保持同等。因此这里行使 Peer 这个抽象层,正好可以办理这个题目。这也可以用于那些行使某种动静行列中间件的环境,由于也许这些中间件,也是多路复用一个 fd 的,乃至也许就不是通过行使 fd 的 API 来开拓的。

对付上面的 Transport 界说,对付 TCP 的实现者来说,长短常轻易能完成的。可是对付 UDP 的实现者来说,则必要思量怎样充实操作 Peer ,出格是 Peer.fd_ 这个数据。我在实现的时辰,行使了一套假造的 fd 机制,通过一个客户端的 IPv4 地点到 int 的对应 Map ,来对上层提供区分客户端的成果。在 Linux 上,这些 IO 都可以行使 epoll 库来实现,在 Peek() 函数中读取 IO 变乱,在 Read()/Write() 填上 socket 的挪用就可以了。

其它,为了实现处事器之间的通讯,还必要计划和 Tansport 对应的一个范例:Connector 。这个抽象基类,用于以客户端模子对处事器提倡哀求。其计划和 Transport 大同小异。除了 Linux 情形下的 Connecotr ,我还实现了在 C# 下的代码,以便用 Unity 开拓的客户端可以利便的行使。因为 .NET 自己就支持异步模子,以是着实现也不费太多工夫。

  1. /** 
  2.  * @brief 客户端行使的毗连器类,代表传输协议,如 TCP 或 UDP 
  3.  */ 
  4. class Connector { 
  5.  
  6. public:    virtual ~Connector() {}     
  7.   
  8.     /** 
  9.      * @brief 初始化成立毗连等 
  10.      * @param config 必要的设置 
  11.      * @return 0 为乐成 
  12.      */ 
  13.     virtual int Init(Config* config) = 0; 
  14.  
  15.     /** 
  16.      * @brief 封锁 
  17.      */ 
  18.     virtual void Close() = 0; 
  19.  
  20.     /** 
  21.      * @brief 读取是否有收集数据到来 
  22.      * 读取有无数据到来,返回值为可读变乱的数目,凡是为1 
  23.      * 假如为0暗示没稀有据可以读取。 
  24.      * 假如返回 -1 暗示呈现收集错误,必要封锁此毗连。 
  25.      * 假如返回 -2 暗示此毗连乐成连上对端。 
  26.      * @return 收集数据的环境 
  27.      */ 
  28.     virtual int Peek() = 0; 
  29.  
  30.     /** 
  31.      * @brief 读取收集数  
  32.      * 读取毗连内里的数据,返回读取到的字节数,假如返回0暗示没稀有据, 
  33.      * 假如buffer_length是0, 也会返回0, 
  34.      * @return 返回-1暗示毗连必要封锁(各类堕落也返回0) 
  35.      */ 
  36.     virtual int Read(char* ouput_buffer, int buffer_length) = 0; 
  37.  
  38.     /** 
  39.      * @brief 把input_buffer里的数据写入收集毗连,返回写入的字节数。 
  40.      * @return 假如返回-1暗示写入堕落,必要封锁此毗连。 
  41.      */ 
  42.    virtual int Write(const char* input_buffer, int buffer_length) = 0; 
  43.  
  44. protected: 
  45.     Connector(){} 
  46. }; 

Protocol

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读