代码参考

代码文件参考下述详解的类图,工程参考第零章工程说明

概述

在多人联机游戏中,大多采用前、后台的架构,前台多表现相关,后台则多交互、资产相关。网络消息的传递其实是由系统内核完成的,大多语言封装了Socket库面向开发者提供网络消息传递的接口,而这里的网络模块是对网络消息传递包含编码、发送、接收、解码、广播等行为的进一步封装,以方便业务上的使用。

关键

  • 前后台约定一种编码、解码的格式(即协议),用于切割解释数据字节流包含的信息。协议应包含(消息名、消息名长度在某些编码中可以省略,例如直接发送json可以固定某个字段为消息名,则只需要消息长度,消息体即可):

    • 整个消息长度:系统内核发送消息不是一个一个发送的,多个消息的数据块可能会粘贴在一起,需要知道消息长度才能把连续的消息分割出来。
    • 消息名:用于响应网络消息的key,例如是登录还是登出等等。
    • 消息名长度:用于分割这条消息消息名和消息体
    • 消息体:消息数据
  • 消息的发送、接收是非阻塞的,否则会阻塞进程造成玩家卡顿(另外一种思路是多线程阻塞处理,可能是要考虑线程切换/阻塞的消耗,至今未见过如此处理)。发送和消息处理使用生产-消费模式,即建立任务,每帧处理一定量的任务尽量避免卡顿。

细节

客户端网络模块

  • NetMgr:对Socket库进一步进行了封装,是面对其他开发者处理网络消息的接口。完成消息编码、发送、接收、解码、分发等工作。
  • RWBuffer:维护一个byte数组,用于读写数据
  • MsgBase:消息继承自该类,提供编码解码方法

协议编码



使用消息长度+消息名长度+消息名+消息体进行编码,消息长度和消息名长度各占两位占据整体消息的前四位,来确定消息分割。

长度编码



采用两位确定长度,使用移位可以提升些许性能。

消息传递



其他开发者给勾兑好消息调用发送请求接口,网络模块进行消息编码后推推入发送消息队列。Socket库的发送循环取出配置的数量消息写入系统的发送缓冲区,未来某时内核系统发送字节数据流(此时可能会粘包,即不同个消息可能会一起发送,首末尾的消息可能不完整),数据包经网络路由到达指定IP设备,Socket库响应用户处理网络消息的方法根据协议约定分包拆包推入消息处理队列。主循环取出配置量消息分发并响应。

备注

  • Demo这里注重的它的核心思想自定的协议,大型商业项目协议一般会使用protobuf或者sproto,它们会有(或者自己拓展)相对完整的工具链,在编码方面会更加快速,压缩成更少的数据量,在解包速度和网络流量上更具优势。当然,直接使用json或者其他自定协议格式都是可以实现的,开发者可以权衡利弊。

U3DFrameWorkDemo:六、网络的更多相关文章

  1. 龙六网络科技有限公司(Dragon six Network Technology Co., Ltd.)

    龙六网络科技有限公司(Dragon six Network Technology Co., Ltd.)

  2. android 学习随笔六(网络要求及配置)

    android在4.0之后已经不允许在主线程执行http请求了. 主线程阻塞,应用会停止刷新界面,停止响应用户任何操作,耗时操作不要写在主线程   只有主线程才能修改UI ANR异常:Applicat ...

  3. [19/04/13-星期六] 网络编程_基本概念(关注传输层、数据传输,TCP和UDP)

    一.概念 ▪ 什么是计算机网络? 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统, 网络管理软件及网络通信协议的管理和协调下,实现资源共享和信 ...

  4. 开源中国iOS客户端学习

    开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客    http://blog.csdn.net/column/details/xfzl-kykhd.html ...

  5. PCB设计流程

    一般PCB基本设计流程如下:前期准备->PCB结构设计->PCB布局->布线->布线优化和丝印->网络和DRC检查和结构检查->制版. 第一.前期准备. 这包括准备 ...

  6. 7-9The Morning after Halloween uva1601

    这题可以用普通bfs来做  也可以用双向bfs来做(先欠着) 有点类似专题训练的一题   不过那题是找钥匙开门   不过都用了状态压缩 题意:  n,m(<=16) 的网络上有t(<=3) ...

  7. Android应用程序的自动更新升级(自身升级、通过tomcat)(转)

    Android应用程序的自动更新升级(自身升级.通过tomcat) http://blog.csdn.net/mu0206mu/article/details/7204746 刚入手android一个 ...

  8. Android基本概念总结

    Android工程师 源码开发(手机定制软件) 系统开发(驱动 系统软件) 应用开发 (单机 联网 游戏 应用) 一.Android应用程序的组成部分 Activity Activity 应用程序的表 ...

  9. Android面试常问到的知识点

    一.算法,数据结构 1.排序算法 2.查找算法 3.二叉树 4.广度,深度算法: 二.java基础 1.集合Collection,List,Map等常用方法,特点,关系: 2.线程的同步,中断方式有几 ...

  10. Linux常用命令全集

    一,安装和登陆命令1,进入图形界面 startx 2,进入图形界面 init 5 3,进入字符界面 init 34,登陆 login 5,关机 poweroff -p 关闭机器的时候关闭电源-n 在关 ...

随机推荐

  1. Elastic学习之旅 (7) 聚合分析

    大家好,我是Edison. 上一篇:ES的Query DSL 什么是ES的聚合 Elastic除搜索之外,还提供针对ES数据的统计分析功能,具有较高的实时性. 通过聚合,我们可以得到一个数据的概览,它 ...

  2. C#中DataGridView动态添加行及添加列的方法 并赋值在第一行

    http://www.jb51.net/article/72259.htm Datagridview添加列: ? 1 2 3 4 5 DataGridViewTextBoxColumn acCode ...

  3. SqlServer 查看所有触发器信息的命令

    https://blog.csdn.net/chenghaibing2008/article/details/45332993 SELECT       object_name(a.parent_ob ...

  4. 保姆级教程:跟虚竹哥用Gemini-2.5-pro,一步搞定任何内容的思维导图,国内直接使用

    零.前言 每一份厚重的报告,每一篇深奥的论文,都像一座等待探索的知识矿山.我们常常深陷于文字的细节中,却迷失了通往宝藏的路径.你是否想过,如果有一张地图,能清晰标示出每一条知识的脉络与连接,这场探索之 ...

  5. node运行ts

    前言 node v23开始直接支持ts,也就是说可以直接 node xxx.ts. 但是v23成为lts还需要几个月时间吧. 那么再次之前我们应该怎么让他支持呢? tsc 标准的做法,将ts打包成js ...

  6. vim 变换分屏幕大小

    参考 CSDN博客 左右移动屏幕 一直不知道 vim 是怎么调整分屏幕的大小的. ctrl + W 然后松开这两个键按下 输入 数字> 就是移动几个字符的意思. Example : 10 > ...

  7. openwrt 烧录rootfs的大小

    make menuconfig 里面有一个 target Image的选项,然后进去可以在rootfs修改烧录sd卡的大小

  8. java 切换不同的显示风格

    简介 java 切换不同的显示风格 code import java.awt.*; import javax.swing.*; public class ImageTest { public stat ...

  9. docker安装和镜像管理

    centos版本8.5 清除密钥文件,开机会自动生成 rm -rf ssh_host_* 清除机械id cat /dev/bull > /etc/machine-id 关机 这样的话,模版就完成 ...

  10. ORA-01109数据库未打开-九五小庞

    SQL> startup mountORA-01081: 无法启动已在运行的 ORACLE - 请首先关闭它SQL> shutdown immediateORA-01109: 数据库未打开 ...