农妇山泉一亩田 发表于 2025-3-31 07:25:51

Games104——网络游戏的架构基础

多人网络游戏面对的挑衅


[*]保证每个用户事件的同等性
[*]网络耽误和丢包
[*]反作弊反信息泄露
[*]复杂的装备,快速举行热更新迭代
[*]复杂度高
https://i-blog.csdnimg.cn/direct/b5c9f9217149471fa5295f030ac4d923.png
网络协议

OSI模子

https://i-blog.csdnimg.cn/direct/5a050983ca16470380bb8d6a3e2dd5be.png
Socket

通过一个简单的接口与别的一台呆板建立连接就可以连续不绝的传输数据
https://i-blog.csdnimg.cn/direct/fe33717a1d554a2bb301feb92a1f3d90.png
TCP/IP协议

特点:连接稳定、流量控制、包头长,保证信息的同等性
https://i-blog.csdnimg.cn/direct/5c00dd621e70402abe44c17b14885019.png
TCP的拥塞控制
https://i-blog.csdnimg.cn/direct/5dc9daa23f32496d891a5b6afaea6b21.png
对于对时间不太敏感但对稳定性有要求的游戏适合用TCP
UDP协议

端到端的协议
特点:不需要建立长时间的链接、不需要流量控制、包头轻、流传很快、但稳定性不行轻易转达不到
https://i-blog.csdnimg.cn/direct/6f22362f6c354f1c8321a5711cbe15cf.png
在不稳定的网络情况下要求响应速度块适合用UDP,如吃鸡类
基于UDP的可靠连接

对于大型MMO不会利用单一协议,哪个适合用那个,游戏开发很多时间不会利用原生态协议
https://i-blog.csdnimg.cn/direct/9b62e89bc4274e928e030d66f0779408.png
主动重复的要求

https://i-blog.csdnimg.cn/direct/38ac4404827d4ad69ac2a5d77cb78232.png


[*]Stop and Wait ARQ
等候ACK包到达后再去发下一个
https://i-blog.csdnimg.cn/direct/4028e1343bf942819a49c398b5e93fb3.png
[*]Go Back N ARQ
发现一个包丢失后将窗口中的重新传一遍
https://i-blog.csdnimg.cn/direct/677ffa4f6b754161bd1ccad7b5ac83a0.png
[*]选择重传ARQ
告诉哪个包没有传到,重传没传到的那个包即可
https://i-blog.csdnimg.cn/direct/c29ee9a9a4514781ba48117732c8056d.png
[*]Forward Error Correction FEC
https://i-blog.csdnimg.cn/direct/bf6696f644a0420ba2999410d7c1f744.png
Forward Error Correction FEC

XOR-FEC(异或运算)

https://i-blog.csdnimg.cn/direct/abbb67795d8f4270b70f1aa0c33c99ef.png
https://i-blog.csdnimg.cn/direct/087b27984e424d2d8486ce28274c0ebc.png
如果丢失任何数据包,可以利用其他四个数据包举行规复。
连续数据中只能丢失一个数据包。如果A和B同时丢失,算法将无法规复。
不实用于丢包率高的情况
Reed-Solomon Codes

https://i-blog.csdnimg.cn/direct/11425b0680594192abaa0b402c2b6c0a.png
https://i-blog.csdnimg.cn/direct/6aa7bb2151a64432874c9a2ad4f1568e.png
https://i-blog.csdnimg.cn/direct/b5f38678985b4568be517952a58c5cb2.png
可以通过矩阵计算得到丢掉的数据
丢包率高的情况(比如移动端)也可以保证传输数据
https://i-blog.csdnimg.cn/direct/3319237787df446a820f3dc604486840.png
可以根据具体需要DIY传输协议
时钟同步&RPC

对战游戏的重点就是要将时钟对准
RTT

我发一个包给对方多久能得到一个回包
https://i-blog.csdnimg.cn/direct/c75651150b0c4d42a98b801ff0e04149.png
RTT是自己写的,Ping更方向底层
如何去对时间?
NTP

https://i-blog.csdnimg.cn/direct/2b53abcc6dea435396a5dc171d432b90.png
https://i-blog.csdnimg.cn/direct/1b84f5f8ae574dd68a7b3ed9c0da3beb.png
https://i-blog.csdnimg.cn/direct/ca6b2b7cad96409f8a88eebfedd656a8.png
默认上行下行的时间是对等的,但事实上上下两路不一定是对等的,以是该算法不会很准确
在波动的网络下无法对定时间,只能推测
客户端和服务端建立连接时第一时间就要把钟对好
https://i-blog.csdnimg.cn/direct/2e4767b3c1524d67b0d53f9640480cea.png
https://i-blog.csdnimg.cn/direct/ffcea60b68134a0ca6c4f02f056306d8.png

[*]把NTP算法先跑一遍,算出来客户端时间和服务端时间的差异
[*]调整客户端的时钟,由于网络会波动,以是多做几次NTP算法,记录每次RTT
[*]去掉RTT比平均值高的值,再做一次平均,再用这个平均值对钟举行调整
RPC

对程序员而言在服务器和客户端之间网络传输会有以下的困难:
运行用差异语言编写
过程利用差异巨细的数据类型
利用差异的字节顺序(字节序)
以差异的方式表示浮点数
具有差异的数据对齐要求
https://i-blog.csdnimg.cn/direct/d51e921f746548f599bcb9ce4bb03960.png
https://i-blog.csdnimg.cn/direct/465fb74fbf0244e2b0e892e9985cd80f.png
RPC让程序员不需要定义复杂的网络报体结构,从而专注的写游戏逻辑,只需要传几个参数即可
Stubs

相当于票据存根
https://i-blog.csdnimg.cn/direct/773920c07cba408988c23a93dda30231.png
Stubs Compiler读取 lDL 声明,并生成两个 stub
服务器程序员实现服务的程序,并将其与服务器端的stub链接起来。
客户端程序员实现客户端程序并将其与客户端的stubs链接起来
subs管理客户端和服务器之间远程通讯的全部细节。
网络拓扑

P2P

早期利用的网络架构,研发商不需要维护服务器
https://i-blog.csdnimg.cn/direct/0f22410280cc4c1e98f6a1023e1a5a39.png
Dedicated Server

在服务器端维护一个游戏天下,由研发商提供
https://i-blog.csdnimg.cn/direct/bd37e6f3cfef41ab8141adcc650350b8.png


允许差异地区的玩家在服务器之间建立高速的连接
https://i-blog.csdnimg.cn/direct/09a520ea464a4a46ac3e8c76a318f841.png
快照同步

早期利用
客户端把自己的输入发给服务器,服务器把整个游戏天下的状态生成一个快照,然后把快照发给全部的客户端
保证了状态的同等性
https://i-blog.csdnimg.cn/direct/85dd07066a6f4ea3a13672d6f625f7a5.png
服务端和客户端之间的帧率差异,快照生成的算力消耗大,以是利用Delta
https://i-blog.csdnimg.cn/direct/c8096854119b439d997721803f1b131a.png
缺点:快照数据量大,不适合用户数据量大的情况
客户端没有举行计算,浪费了客户端的算力
帧同步

服务器:信息的同步汇总转发
Initialization

初始化游戏内焦点数据,保证局内数据高度同等化
服务器获取到全部客户端的输入,并将全部客户端的输入再发放给每个客户端,但最慢的用户会拖慢全部的进程
https://i-blog.csdnimg.cn/direct/63471b7d2ecc4b8580df9b7396c81f55.png
https://i-blog.csdnimg.cn/direct/02ad2ace9c374012a43f3597614caa89.png
设置一个上限,如果有客户端在时间内没有输入则直接舍弃,但会产生一些潜伏的bug和用户输入无效的题目
https://i-blog.csdnimg.cn/direct/ea429cc82dcb42c3853b164662c75b55.png
难点:要构建一个确定性的游戏天下
https://i-blog.csdnimg.cn/direct/ac6bbad72de44de7a99c32c2201b6180.png
如何办理


[*]保证浮点数的高度同等性
https://i-blog.csdnimg.cn/direct/ad33fa33be8f47df84ea83a274358e56.png
[*]保证随机数的确定性
https://i-blog.csdnimg.cn/direct/2a741a66e6f54641b7dca4d2a0d1f237.png
https://i-blog.csdnimg.cn/direct/b6aee24fab2d4efbb95473d8e0e09f4a.png
Lag and Delay

无法规避网络抖动就可以利用buffer
在各个节点catch很多的数据,在当地网络抖动时smooth,以达成观看时稳定的效果
办理网络耽误和抖动的题目
https://i-blog.csdnimg.cn/direct/b3ac5c1a8a814824aba8e54d8b56c007.png


将逻辑帧和渲染帧分割开来,画面不会抖动
https://i-blog.csdnimg.cn/direct/846a4bfac6a24897b68eb41d14f1739e.png
断线重连

断线重连时可以根据客户端留存的快照淘汰断线重连时产生的差距,方便追上
https://i-blog.csdnimg.cn/direct/2b16b31494a342fca8836e01dc098682.png
服务端会在几个关键帧举行快照,当玩家过长时中断线时可以根据服务端的快照,帮助setup游戏的状态
https://i-blog.csdnimg.cn/direct/a8a60b5c91254077a2644159dd956411.png
别的一个紧张的应用场景是观战
https://i-blog.csdnimg.cn/direct/f6e80e4484f54556a2f8b1fd40796b70.png
https://i-blog.csdnimg.cn/direct/fd43a16eed9f49c5bb18adbedec40198.png
基于帧同步的机制可以拓展出这些游戏玩法
反作弊

投票机制
每隔一段时间每个客户发送一个校验码,如果有一个客户的校验码有误则将其踢掉
https://i-blog.csdnimg.cn/direct/7ba50d4c26414922a56ca6bb14103473.png
帧同步的特点是在客户端可以获取到局内全部的状态,游玩时利用插件就可以获取到这些状态,但现在的游戏会接纳一些方法来规避这些题目
优点:可以做一些打击状态清楚的对抗,方便做游戏录屏
缺点:保持同等性很难
状态同步

同步用户的状态信息,如关键性的爆炸,殒命等
每一个玩家提供部分的信息,Server去模仿一个天下,只把与每个用户相同的信息发给他,防作弊的本事好于帧同步
https://i-blog.csdnimg.cn/direct/6a933e8e9fba4a1e9c695ca5ec86a1ca.png
https://i-blog.csdnimg.cn/direct/e68700db4c914ea988c300c20578c697.png


[*]Authorized
玩产业地客户端
[*]Replicated
在其他玩家客户端上1P的复制体
整个天下的焦点逻辑都是由Server计算的
不要求全部的客户端保证确定性
状态同步面对的题目
https://i-blog.csdnimg.cn/direct/def198c11fad458a8cc7c6f63b2358ed.png
客户端预测

先预测半个RTT的时间再加上一个Command frame的动作,等服务端数据回来之后再对齐,尽可能让移动平滑
https://i-blog.csdnimg.cn/direct/71c6e964ae0842089dd0e8f7232dffa2.png
服务端息争

如果在Server的时间点状态不同等,那必须根据Server的要求反向矫正行为
https://i-blog.csdnimg.cn/direct/c28e74eb84da4f0f8cfddb5f711e9031.png
服务端需要一个RingBuffer存储过去几帧,出现了状态不同等的题目后RingBuffer之后的数据全部无效化重新算一遍
https://i-blog.csdnimg.cn/direct/7ea72fddd5ad4311b98296ca3fc2f655.png
丢包题目

用RingBuffer把输入存储下来,在获取不到输入时接纳最后一次输入的状态
https://i-blog.csdnimg.cn/direct/e18d3c80f67e427ab2d84a5a90ca18fa.png
状态同步适合网络和游戏业务比较复杂的情况
状态同步和帧同步的区别

https://i-blog.csdnimg.cn/direct/9a069f18b78349bd8ab811e6ae64ae29.png
对比项状态同步(State Synchronization)帧同步(Lockstep Synchronization )确定性逻辑非必要必要响应性更好较差网络流量通常较高通常较低开发服从复杂得多易于开发,但调试困难玩家数量支持玩家数量较少支持少量和大量玩家跨平台相对轻易相对困难重连相对轻易相对困难回放文件巨细大小防作弊相对困难相对轻易
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Games104——网络游戏的架构基础