FPS游戏框架漫谈第二十一天

今天要谈的是FPS手游的网络同步方案**
一、同步与网络传输方案
1.FPS游戏不需要所有客户端严格的保持一致性
2.采用的是C/S同步 也就是1P客户端发请求给服务器 服务器收到请求之后转发给3P客户端
3.客户端预测 预表现有什么好处 也就是不需要等服务器的包下发 客户端已经在模拟了,让玩家的体验就是感觉流畅的,特别是弱网络环境下尤为明显,既然是预表现 就说客户端也需要跑物理,跑逻辑,意味着和没有预测的游戏相比发热更加明显,跑物理具体指的比如3P玩家会根据现有的速度和方向进行自动行走 你不可能直接走出遮挡物了吧,也就是需要做物理碰撞逻辑, 不过我玩王者的时候好像人遇到过直接穿墙了,可能是因为这个不影响实际数据,网络恢复后客户端可以拿到正常的位置。所以没有做物理检查。
4.服务器是权威 客户端只是一个显示屏 什么意思呢?就是什么东西都是服务器给你计算好了结果 后台把结果发给你,你进行展示而已, 逻辑都在客户端,客户 端进行大量的物理计算,那我们的cpu疯狂干活,发热会很快,然后cpu会降频,玩到最后只能等热量散去。
现在我们把这些关键逻辑全部拿到服务器去做的,客户端只是做展示 同时天然的让后台具备防作弊的超能力。
5.采用冗余重传机制对抗弱网 具体好处是怎么来的呢,比如我后台需要下发5帧数据给客户端 如果第一帧我就下发第一帧的数据
第二帧我除了下发第二帧的数据 同时把第一帧的数据又带下去给客户端 第三帧的时候 我可以继续带入第一帧和第二帧的数据 或者只带入第二帧的数据 具体冗余多少根据当前网络状态去做动态调整 那么客户端怎么去处理冗余包呢,其实很简单客户端只需要记录当前处理过的最大帧的编号 这样前面的帧比后面的因为网络原因后到,客户端比对帧编号发现现在到的帧编号小于我们当前的帧了 我就直接丢掉了 冗余方案的好处是假如我第二帧丢了 刚好网络拥塞了下 然后我第三帧直接把第二帧带下去了 那么客户端马上可以进行模拟, 如果你要走什么丢包重发 我不想说啥了 估计黄花菜都凉了????????????
二、网络同步
这类游戏涉及需要网络同步的数据分3类
1.游戏状态类的数据 这个数据绝对不能出错的,玩过游戏的人都知道,比如我在对局杀了一个人,你后台没有传给我,玩家是不是会举报你,那么这类消息采用的协议必须是可靠协议 一般是采用UDP+基于应用层面上的重传机制保证可靠性。
2.移动包
这类消息属于不可靠消息 你可以丢 但是必须是有序的 也就是客户端必须根据后台下发的顺序进行依次处理, 比如后台第一个包下发往前走 但是3P那边没有收到 然后玩家马上往后走了 发了往走的包给后台 后台在把这个包发给3P 这个时候如果往前走的包也到了 那么我们根据缓存中检查到后面的包已经到了 那么第一个包是不需要处理的 因为时间流逝了。
3.纯表现的数据
主要是刷新UI的,做过很多系统的客户端应该比较清楚,这个数据就算丢了 下次触发重拉协议界面展示正常,一般这个不会特意去加逻辑去保证一般有数据。
三、PVP移动同步
真的同步吗?????????????实际没有的
这里是3个角色 第一个就是1p也就是正在电脑前面玩射击游戏的你 第二个是王者的对局服务器 第三个是3P也就是他在其他玩家手机里被看到的你
我讲一个案例 假如你开始移动 你会发一个移动包给后台 后台拿到包之后校验下你能不能走 校验通过后然后才把你的移动包发其他玩家的手机上去,然后拿到这个移动包更新远在天边的你,这个时候 是不是你其实已经走了一段距离了 然后其他玩家手机上的你才开始走, 是不是就不同步了所以为了解决这个问题 3P会以更快一点的速度去追上1P的你,也就是说3P必须要把因为网络浪费的时间的路给补上来。但是这样是不是会感觉2者速度有差异,是的,所以3P一定要做预变现 平滑插值等各种手段去弥补
如果说1P发给后台的移动包被后台拒绝了 一般后台会带给你校正包 修正你的位置,比如如果你开挂了把你的速度改的特别大,那后台肯定是可以发现这个速度异常进行拒绝你移动的。 一般1p发了移动包之后 服务器就一直会模拟你的移动 直到你的什么操作打断了移动
四、如何对抗弱网下的移动同步
1.延迟
包如果是延迟到的话 利用RTT也就是从1p到3p的过程经历的时间, 3p需要加速追赶1p
-插值
-预测 比如我 p1 = p0 + v0时间流失量 也就是说我后一帧的位置 是上一帧的位置加速上一帧的速度时间流失
2.丢包
包如果都丢了的话,只能根据现有的移动路点进行计算我可以走哪些路点 可以到达后续包。

四、PVP射击同步
1.首先是客户端开火+播放动作+特效 然后就直接告诉服务器了,服务器校验通过就会转发给3P 3P就会做表现 播放动作 特效之类的
然后客户端就会执行碰撞检查做击中对手预表现 和伤害的预计算, 然后把伤害包发给服务器, 如果服务器相同的击中校验通过 就会下发伤害包给1p和3p 这类包属于广播类 , 然后后台会做死亡的检查,如果死亡 也广播击杀包 让客户端做死亡表现。
涉及的协议有 Client StartFire DoDamage Server SyncStartFire SyncDamage SyncKill
谢谢大家的耐心阅读
感恩我们同在

你可能感兴趣的:(unity,FPS,游戏)