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

这篇具有很好参考价值的文章主要介绍了Unity框架设计系列: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网络框架的架构设计结构图,供大家参考。

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

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

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

 文章来源地址https://www.toymoban.com/news/detail-421973.html

到了这里,关于Unity框架设计系列:Unity 如何设计网络框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring框架全系列】如何创建一个SpringBoot项目

    🌇哈喽,大家好,我是小浪。前几篇博客我们已经介绍了什么是Spring,以及如何创建一个Spring项目,OK,那么单单掌握Spring是完全不够的,Spring的家族体系十分强大,我们还需要深入学习,以便于我们后续达到能独立做项目的水平。今天我们来学习SpringBoot。🏜 📲目录 一、

    2024年02月03日
    浏览(37)
  • 如何理解网络—网络框架介绍

    目录 前言 一.计算机网络背景 二.局域网和广域网 三.网络协议 3.1产生的背景 3.2分层实现 四.OSI七层模型 4.1OSI七层模型的结构 4.2如何理解OSI七层模型 五.TCP/IP五层(或四层)模型 六.网络传输基本流程 7.网络中的地址管理 7.1IP地址 7.2MAC地址 7.3MAC地址和IP地址的区别和联系 总结

    2024年02月08日
    浏览(26)
  • Unity2D 商业游戏案例 - 梦幻西游(第二季 框架设计篇)

    01 Unity2D 回合制游戏案例 - 梦幻西游(第一季 战斗逻辑篇) 01 Unity2D 回合制游戏案例 - 梦幻西游(第一季 战斗逻辑篇)【B站的第一季的部分视频】 02 Unity2D 商业游戏案例 - 梦幻西游(第二季 框架设计篇) 03 Unity2D 商业游戏案例《梦幻西游》(番外篇 - 场景系统) 。。。。。

    2024年02月05日
    浏览(61)
  • Unity之如何接入HybridCLR(代号wolong,原huatuo)热更新框架

    HybridCLR(代号wolong)是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案。 官方提供了完整的教程:HybridCLR快速上手 官方还提供了一个简易的小Demo,演示了如何使用HybridCLR实现热更新。hybridclr_trial 官方文档其实已经非常详细了,我写本文目的主要

    2024年02月12日
    浏览(27)
  • 如何编写接口自动化框架系列通过yaml来管理测试用例(四)

    本文是接口自动化测试框架系列篇的第四篇 ,主要介绍yaml包的使用 。自动化测试的本质是将功能测试用例交给代码去 目录 1. yaml介绍? 2.python中的yaml包 3.项目中使用yaml包 4 项目总结 执行 ,测试人员往往是在自动化框架添加对应的测试用例即可(也叫测试脚本)。而维护测试

    2024年02月07日
    浏览(42)
  • DeeTune:基于 eBPF 的百度网络框架设计与应用

    作者 | 百度APP云原生技术研发组 导读 随着云计算的技术的不断迭代演进,百度内部服务逐渐搬迁到云环境中,部署成本和效率取得明显收益,但一些可观测能力的短板和缺失逐渐显露,传统的方式往往通过植入代码进行修改来实现,但在业务形态和技术栈多样性的背景下,

    2024年02月09日
    浏览(35)
  • C++高性能服务器网络框架设计与实现

    这篇文章将从两个方面来介绍,一个是服务器中的基础的网络通信部件;另外一个是,如何利用这些基础通信部件整合成一个完整的高效的服务器框架。注意:本文以下内容中的客户端是相对概念,指的是连接到当前讨论的服务程序的终端,所以这里的客户端既可能是我们传

    2024年02月04日
    浏览(37)
  • JAVA网络心理测评系统设计与实现(Springboot框架)

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、

    2024年02月03日
    浏览(23)
  • 第九十四回 如何打造一个网络框架

    我们在上一章回中介绍了\\\"如何mock数据\\\"相关的内容,本章回中将介绍如 何打造一个网络框架 闲话休提,让我们一起Talk Flutter吧。 最近在项目中使用dio处理网络相关的内容,有些地方的代码不能利用,有些地方的代码耦合度比较高,因此准备在dio上面封装一层网络层,这些可

    2024年02月15日
    浏览(28)
  • Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架)

    大语言模型 (Large Language Models, LLMs) 在不同领域都表现出了优异的性能。然而,对于非AI专家来说,制定高质量的提示来引导 LLMs 是目前AI应用领域的一项重要挑战。现有的提示工程研究已经提出了一些零散的优化原则,也有些研究设计了基于经验的提示优化器。然而,这些研

    2024年03月11日
    浏览(104)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包