首页 > 其他分享 >Unity框架设计系列:Unity 如何设计网络框架

Unity框架设计系列:Unity 如何设计网络框架

时间:2024-02-18 10:13:07浏览次数:28  
标签:Socket 框架 TCP Unity 设计 序列化 数据包 连接

在Unity框架设计中与游戏服务器对接的网络框架也是非常重要的一个模块,本文給大家分享如何来基于Unity来设计一个网络框架, 主要的讲解以下几个点:

(1) TCP半包粘包, 长连接与短连接, IO阻塞;
(2) Tcp Socket与UDP Socket 的技术方案;
(3) Unity的序列化与反序列化技术方案;
(4) TCP的封包与拆包;
(5) 基于http的短连接技术方案;
(6) Unity 网络框架设计与实现原理;

TCP半包粘包, 长连接与短连接, IO阻塞

TCP 是可靠的网络传送协议,网络传输底层每发送一个TCP数据包,就要等对方确认,收到确认消息以后才能发下一个TCP数据包。当我们在应用层发送一个应用层的数据包的时候,TCP网络底层可能会把这个应用层的数据包分成若干”TCP数据包”,通过网络底层发出去。那么这里就会有一个问题,应用层发的数据包有可能被拆散成几个”TCP数据包”发出去,我们在另外一端接收的时候,可能要把这些拆散的包组合起来。这个就是”半包”。底层有可能把两个应用层的数据包分到一个”TCP数据包”发过去,接收到后,一部分是属于上一个应用层的数据包,一部分属于下一个应用层的数据包,这个叫做”粘包”。

TCP 是面向连接的,服务端与客户端通过TCP 连接来传送数据,如果连接一直在,发送完数据后,不关闭连接,下一次发数据可以直接发送,我们叫做长连接。如果发送数据先建立连接,数据发送完毕后,马上关闭连接,下次要发送数据重新建立连接,这种叫做”短连接”。长连接一直存在,优点就是客户端与服务端随时可以相互通讯,但是一直占用连接资源。短连接是不占用连接资源,但是只有客户端能像服务端发送数据,服务端在断开连接后无法主动通知客户端。

IO阻塞指的是我们的CPU处理数据的速度,远远大于网络的传送速度。当我们要发送数据的时候,CPU调用IO的接口,把数据从内存拷贝到网络底层,等待底层把数据传送过去后,CPU调用的IO函数返回,而这个过程,CPU在等待网络把数据发出去,线程挂起了,这个我们叫做IO阻塞。

Tcp Socket与UDP Socket 的技术方案

了解完网络的一些基本概念以后,接下来看下使用TCP/UDP Socket用哪些技术方案。Unity其实是作为网络的客户端,而客户端只要去连接服务端与服务器通讯就可以了,不用像服户端同时处理N个客户端的数据传送。所以客户端Socket非常的简单。Unity客户端的Socket我们用哪个插件呢?其实这种完全不需要用什么插件,直接使用OS为我们提供的Socket的相关API就可以了。

TCP Socket 面向连接的,使用流程如下:

1: 客户端Connect服务端,建立Socket连接;

2: 调用Socket的Send函数发送数据;

3: 调用Sokcet Recv函数从Socket上读取数据;

4: 关闭Socket 的连接;

UDP Socket的使用, UDP Socket不是面向连接的,只是调用底层的网络协议,直接把数据包发往特定地址+端口。所以直接是SendTo(网络地址+端口), RecvFrom(网络地址+端口)

TCP/UDP Socket已经足够简单,Unity开发者在选取技术的时候直接使用即可。

Unity的序列化与反序列化技术方案

网络发送的都是数据字节流,Unity与服务端通讯要把要发送的数据对象变成二进制字节流,然后通过网络传送出去,收到字节流以后,又要重建回数据对象,完成数据发送。数据对象变成二进制字节流这个过程叫序列化,把二进制字节流转回数据对象叫反序列化。

序列化/反序列化目前主要有两个打的方向:一个是二进制序列化,一个是文本序列化;

二进制序列化/反序列化:基于二进制的bit,通过用户商量的协议来把数据对象变成二进制bit数据流,反序列化的时候根据用户协议,来把bit数据流变成数据对象。

文本序列化: 将数据变成人眼可读的文本数据。当收到序列化好的文本数据的时候,根据文本数据的规则来解析出里面的数据重建数据对象。

二进制序列化/反序列化: 我们把一些基本的数据类型用bit来进行编码,如 int, float, string bool等。写好这些基本数据类型的编码和解码的代码, 然后编写要数据对象的协议,然后开发一个编译器,他可以根据这个协议文件,基于基本数据类型的编码/解码函数,根据协议,结合基本数据类型的编码解码,按照对象的结构,拆分成若干基本数据类型,自动生成编码/解码函数代码。

文本序列化的解决方案: json, xml等;

二进制序列化/反序列化解决方案: protobuf;

TCP的封包与拆包

上面讲解了,应用层的数据包有可能被拆分成若干”TCP数据包”,还有可能两个应用层的数据包连在一起在一个”TCP数据包”中。为了收数据的时候能完整正确的收到应用层的数据包,我们必须要把两个应用层的数据报之间做好分隔标记,当我们收到数据以后就可以根据分隔标记来决定哪些数据是哪个包的。目前有两种做法:

(1) 大小+数据内容+校验码模式;[size][数据body][校验], 游戏开发中经常会使用这种方式来做封包, 收数据的时候,根据大小来将数据包完整的组合出来。WebSocket也是采用的这种方式。

(2) 特定的分割符模式: 123456\r\n67890, Html采用特定的分割符号来拆分数据内容。

基于http的短连接技术方案

短连接,前面个讲过的,用完就断开连接,下次要用的时候再重新的连接。短连接是使用TCP Socket策略,而这种策略最常用的就是http(基于TCP Socket+http超文本传输协议)。

Unity网络框架中也要使用http,主要是和服务器对接基于http通讯以及资源服务器的下载等需求。Unity作为客户端,要使用http,都已经封装好了UnityWebRequest,同时UnityWebRequest是多线程模式,可以同时并发N个请求。

Unity 网络框架设计与实现原理

铺垫了这么多,我们直接来上Unity网络框架的架构设计结构图,供大家参考。

这里接收数据的时候,采用多线程来做,收到数据后,进行拆包与反序列化,得到数据对象后,放事件队列,游戏主线程从事件队列里面获取网络事件,然后进行处理。发送数据出去的时候,我们在游戏主线程调用异步的网络Send函数,避免IO阻塞。注意好这些点,就可以设计出一个很好的网络框架。

本节分享就到这里了,关注我,学习更多的Unity框架设计的技巧。

标签:Socket,框架,TCP,Unity,设计,序列化,数据包,连接
From: https://www.cnblogs.com/bycw/p/18018823

相关文章

  • Unity资源管理系列:Unity项目开发中如何做资源加密
    Unity的游戏很容易被人反编译出来,然后再重新打包发布,把自己辛辛苦苦开发的游戏,抄写的一丝不挂。很多项目要求要做好资源加密,Unity中如何做好资源加密呢?本文給大家分享加密算法+资源打包整合思路:(1)游戏资源加密如何选择加密算法;(2)Assetsbundle资源包的加密与解密;游戏资源......
  • Unity Audio System概要
    Unity的AudioSystem给我们提供了一整套的游戏音频处理解决方案,接下来我们对UnityAudioSystem进行简单的讲解。首先让我们来了解一下UnityAudioSystem包含了哪些重要的组成部分。AudioClip:这个是Unity存放外部音频资源的容器,可以根据我们的需要将外部导入的音频资源进行粗处......
  • 《安富莱嵌入式周报》第332期:铷时钟控制板,航天战斗机C++代码标准,免费开源芯片设计,在线
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版https://www.bilibili.com/video/BV1tU421d7ZK/目录:1、Rubidium铷时钟控制板2、开源小设计,简易万用表连通性测试仪3、免费开源芯片设计软件Electric4、在线电路仿......
  • Vue.js前端框架之vite+vue+naive前端项目模板
    1.搭建Vue示例项目npmcreatevue cdvue-demo:进入项目目录npminstall:安装所有依赖npmrundev:启动项目2.了解Vue开发和工作原理2.1package.json类似于Python项目中pyproject.toml,包含了项目名称、版本、命令、依赖、设定2.2index.html浏览器访问到的HTML文件 ......
  • 【高可用高性能环境】多用户、高并发环境研究设计与测试验证
    在设计和测试多用户、高并发环境时,需要考虑以下几个方面:一、架构设计:采用分布式架构,将系统拆分为多个服务,每个服务负责不同的功能,降低单点故障风险。使用负载均衡技术,将流量均匀地分发到不同的服务器上,提高系统整体性能和可用性。二、数据库设计:使用适当的数据库技术,如主从复......
  • 【Unity】消息系统
    介绍封装的消息机制使用注册消息Reg(MessageTypemessageType,MessageDelHandlehandle);messageType :注册消息类型handle :消息传入时回调方法(该方法需拥有参数Message)注销消息UnReg(MessageTypemessageType,MessageDelHandlehandle);messageType :注销消息类型......
  • Unity手机游戏性能优化系列:针对CPU端的性能调优
    做手机游戏开发的时,经常会遇到手机游戏的性能问题,手机游戏的性能问题可能有很多的方面,今天我们从CPU调优的角度来給大家介绍一下常用的CPU调优的一些经验和手段。这些经验和手段都有可能随着时间与环境的变化改变而改变,具体还是要以实际的为准,先定位性能问题,再上具体的手段。接下......
  • Unity资源管理系列:Unity 框架如何做好资源管理
    Unity资源管理需求分析作为架构师,在开始动手之前,先分析清楚需求,你才能设计出合理的方案,我们来分析一下Unity资源管理都有哪些需求,把需求想清楚了,设计是自然而然的事情。Unity资源管理主要需求:1:为开发与正式发布提供资源的加载/卸载;2:方便远程更新资源。3:带资源与不带资源......
  • 想设计一个高并发的消息中间件前,先熟悉一下这些知识点
    本文分享自华为云社区《面试必问|如何设计一款高并发的消息中间件?》,作者:冰河。消息中间件涉及的知识点要想设计一个具有高并发的消息中间件,那么首先就要了解下消息中间件涉及哪些具体的知识点。通常,设计一个良好的消息中间件最少需要满足如下条件:生产者、消费者模型。支持......
  • 千万级流量下架构设计
    架构设计:千万级流量下的数据强依赖降级 1背景互联网场景下,我们经常会面临一个产品流量从初创时期的小流量到全盛大流量的过程。这时候,原本的架构设计就显得很不合理,变成你追求服务稳定性阻碍。然而这一切并不一定是你的架构能力的问题,而是在小流量场景下,不能过高的去评估容......