首页 > 其他分享 >U3DFrameWorkDemo:六、网络

U3DFrameWorkDemo:六、网络

时间:2023-05-29 17:34:30浏览次数:32  
标签:编码 Socket 网络 发送 消息 长度 U3DFrameWorkDemo

代码参考

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

概述

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

关键

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

细节

客户端网络模块

image

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

协议编码

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

长度编码

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

消息传递

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

备注

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

标签:编码,Socket,网络,发送,消息,长度,U3DFrameWorkDemo
From: https://www.cnblogs.com/hggzhang/p/17142379.html

相关文章

  • docker删除网络报错:Error response from daemon: error while removing network
    在安装harbor发现docker的network已经存在了然后直径ls去查看发现存在如下,然后去rm删除的时候发现删不掉[root@st-test-hemu-harbor-2harbor]<2023052911:37:11>#dockernetworklsNETWORKIDNAMEDRIVERSCOPE35b4409d8f79bridge......
  • vm - centos 配置好后还是网络不通-解决
    1.背景这不是linux系统问题,是vm没有配置好导致2.解决打开目的实例的设置》网络适配器 换为配好的虚拟网卡同时保证win系统开启这个网卡 然后重启虚拟机3.测试cmdping一下 好了,现在可以使用xshell来连接了 ......
  • U3DFrameWorkDemo:四、资源打包和热更
    代码参考代码文件参考下述详解的类图,工程参考第零章工程说明概述热更新方便用户更新,增加用户的留存量。它依赖打包生成的版本文件。思路打包考虑分包策略,包体太大加载速度慢且可能有无效的内存冗余,包体太小可能会频繁加载AB造成效率下降。核心思想是把用到的东西放在一起,通......
  • upc 6445: 棋盘V (网络流费用流解决匹配问题)
    6445:棋盘V时间限制:1Sec  内存限制:128MB提交:325  解决:31[提交][状态][讨论版][命题人:admin]题目描述有一块棋盘,棋盘的边长为100000,行和列的编号为1到100000。棋盘上有n个特殊格子,任意两个格子的位置都不相同。现在小K要猜哪些格子是特殊格子。她知道所有格子......
  • Nginx 如何预防网络爬虫?
    网络爬虫是一种自动获取网页信息并进行处理的程序。爬虫通过访问指定的URL地址,对返回的HTML或其他类型响应数据进行解析、提取所需的数据或信息,并存储到本地或其他指定位置。通常可以用于搜索引擎的抓取、数据挖掘、信息聚合等领域。为了预防网络爬虫,Nginx可以采取以下措施......
  • gps网络时间服务器(时间同步装置)助力电力信息化建设
    gps网络时间服务器(时间同步装置)助力电力信息化建设gps网络时间服务器(时间同步装置)助力电力信息化建设京准电子科技官微——ahjzsz时间的精确和统一是变电站自动化系统的最基本要求。只有电力系统中的各种自动化设备(如故障录波器、继电保护装置、RTU微机监控系统等)采用统一的......
  • 网络收发性能测试-iperf工具
    快速上手:iperf网络性能测试工具(运维必会)Cloud研习社 运维网工 2023-05-2509:00 发表于重庆收录于合集#运维工具87个#运维工程师145个#运维管理84个#网络运维94个#性能测试1个运维网工分享网络运维、运维规划、运维开发、Python运维、Linux运维、dev......
  • 【华为HCIP | 高级网络工程师】刷题日记(10)
    个人名片:......
  • U3DFrameWorkDemo:二、资源管理
    代码参考代码文件参考下述详解的类图,工程参考第零章工程说明概述在游戏项目中有很多资产如:预制体,图片,音频,Lua脚本,Shader等等。他们随打包放在用户的硬盘里。在游戏的运行过程中,需要对这些资产加载和卸载,资源管理模块负责做这些事情。思路U3D会托管资产,也就是说资产一旦被加......
  • U3DFrameWorkDemo:零、工程说明
    序言前段时间拾起U3D时,重新看了一下之前的学习资料,整理成了一个demo。主要包含框架基本模块核心功能实现。当然,这个小demo是我个人的学习和探索,如demo的中文解释,它是一个“原型”--既是它的优点,也是它的缺点。它并不是一个完整的框架,但包含其核心功能模块的实现思路,简单直接(应用......