有状态同步的案例吗??
那为什么外面的大作都选择帧同步呢
求思路呀 nice
用的场合不一样 帧同步一般用于对战模式 短时间联机 状态同步用于开放世界那种大型游戏
服务器上写逻辑去同步 我感觉服务器的人会吐血 而且机器也吃不消
客户端打包的时候需要打包一个 服务端的 目前在弄
这不是后端考虑的吗
我感觉不是 你可以想一想服务器想实现业务 多复杂… 简单的纸牌哪些还可以 但是 像大型游戏 开发世界 后台压根实现不了 所以这种还是属于前端范畴 后端只负责 道具保存哪些 或者 离线位置啥都存储 游戏逻辑还是前端去实现然后打包出来应该服务端 就和UE4 一样
个人理解是帧同步:逻辑处理在客户端,服务端只负责广播和存储。状态同步:逻辑处理在服务端,客户端只接收服务端处理好的结果信息。帧同步容易外挂作弊,服务器负担轻。状态同步难作弊,服务器负担重。
实际上很多项目帧同步和状态同步混合使用。
我之前做过 具体什么游戏就不说了 因为从那家公司离职了 客户端和服务器都需要算 服务端要保证数据准确 如果客户端给的数据不准 服务器会同步客户端的数据
而且也不是属于简单的那种 多人同时在线的那种 一台服务器差不多能撑住一百人左右
状态同步理论上就是逻辑实体状态发生变化时通知其他用户。在此基础上会根据实际情况有很多变种
先说帧同步吧,帧同步比较接近于我们小时候的小霸王的双人游戏。
可以把服务器理解为黑白电视机,客户端理解为手柄,客户端只负责告诉服务器我按了什么按钮,点在了哪个地方。然后服务器告诉其他玩家,就如同小霸王在一台电视上显示两个人的游戏画面一样。最终在自己的屏幕上复刻对应的操作即可达到同步的效果。
状态同步的原则就是如果某某玩家的状态改变了,服务器即刻会向所有玩家转发该消息。
打个具体的游戏例子, 我走到玩家B傍边给他加了一个buff,持续时间30秒,攻击+100%。
帧同步:
在玩家B的电脑上,会有一个隐藏的手会模仿我的每一帧操作,然后跑过来给你加buff,然后按照你的攻击面板和时间来算(假设玩家B开了修改器,把攻击面板改成10000 ,你显示的是20000攻),但是在我这里你还是原来的基础*2。然后就会导致游戏进入异次元时空,虽然没掉线,但是每人显示的画面不一样)。
状态同步:
在玩家B的电脑上,收到了我移动的方向向量和速度(因为我跑动导致我的方向向量和速度改动了)。然后跑到玩家B附近开始释放BUFF(我向服务器发送ID10的BUFF,同时目标为玩家B,服务器会检测我ID10的BUFF是否在CD,有没有蓝,等等一系列前置判断),这个时候检测到我的人物状态改变了,告诉玩家B我正在施法,玩家B电脑就开始显示施法动作。(服务器过了0.5秒,告诉我施法结束了,同时转告所有玩家,我施法结束,同时玩家B获得了ID为10的BUFF。过了30秒,服务器通知所有人,玩家B的BUFF结束)
简单说就是核心逻辑谁处理的区别。通常小游戏级别的不会太多玩家在同一个房间玩,AI挂在某个玩家身上就行了,服务器只管转发消息。要来个百人同屏就挂不住了,就丢给服务器去处理业务逻辑了,就变成状态同步了。不过通常是混着用的,无关紧要的东西还是前端去处理逻辑就行了。
现在主流都是混合同步,及状态同步+帧同步。
拿DOTA2当例子来说,是一个非常完美的混合同步例子了。
DOTA2产生网络差的时候,远程弹道打到目标身上是没有效果的,只有服务器判定生效之后才会扣血。
英雄人物操作用的是帧同步,但是具体技能产生的效果是由服务器判定的。(就算作弊你在本地把攻速间隔改到0,客户端会一直显示你在A人,但是掉血以服务器为主的)。
你以为是5v5实际上是6v6,两边还各有1个服务器上的电脑控制兵线和防御塔。所以DOTA2才能做到没任何人能作弊
摒弃了帧同步断线重连的弱点,像老牌的帧同步代表,WAR3,在进行多次更新之后才有的断线重连,只能通过加速本地游戏进程来实现断线重连,浪费时间。
上次链接发错了
https://mp.weixin.qq.com/s?src=11×tamp=1642586218&ver=3568&signature=GA9DW0vvRTW4RLVAT4f3MklBV1l4Rvbx-2Jho21rNGE81Dky9UM214YxEzr3yQjI3TXJDeYM7DJZ9P-7B7pdBKtWEVvAzx6*XL1EycAa-Q-F16u6J7rd9CnEQCUlzM&new=1
解释非常到位,我的射击游戏也是这么搞的。再也不怕外挂骚扰。