帧同步 java_游戏同步方案——帧锁定同步
最近毕设准备做一个关注游戏同步方案的 demo,准备选用帧同步。正巧所在组火影手游绝大部分的玩法都是使用帧锁定同步来做的,所以在这记录一下。
概述
帧同步,或者更详细的说是帧锁定同步,是将前端的表现划分为每秒n次的逻辑关键帧,客户端的表现根据关键帧完成展示。客户端将指令经由或者不经由服务器广播到所有相关的客户端上,相邻的指令将会被封装为帧并被客户端理解执行。所有元素在某一时刻的状态,都是由各个客户端独立计算出来的。
帧同步方案
这里我们讨论cs架构下的帧同步方案。
下图反应了火影手游pvp玩法中的同步逻辑。
可以看到,服务器端每 66ms 会将接收到的所有客户端指令封装成帧并下发到各客户端中。如果某个帧在传输中丢失了,将会随下一帧重传。同时,使用 seq 和 ack 对每个帧进行确认。如果 99ms 内客户端还没有收到包含自己已发出指令的帧,就要将丢失的指令重传。
无论是客户端发送的 action,还是服务器端的 frame,都要有确认重传机制。frame 的确认就是通过客户端附带的 ack 字段来确认。
乐观锁
标准的帧同步,是要求客户端定时发送指令,服务器必须等待收集到所有客户端的包之后再下发,这个等待帧信息的过程称为帧锁定。如果一个客户端网络卡顿,那么所有客户端都要等待这个客户端的帧同步信息。
乐观锁就是无论是否收集到客户端的信息,都将目前为止收集到的指令封装为帧并下发,客户端发现自己的指令丢失之后应该将指令重传。这样所有客户端不会因为某个客户端的卡顿而卡顿。
不同步,反作弊以及Gamecore
每个客户端都要保证有相同的初始状态,一旦存在不同步,就要快速定位不同步和恢复。
当玩家数多于2个的时候,可以取大多数作为正确的状态,在检测到不同步后恢复。如果是只有两人参与的游戏,如果出现不同步,比较好的解决方法是设计合理的 gamecore。
gamecore 是同时运行在客户端和服务器端的游戏核心逻辑,所有状态结算都由 gamecore 完成,我们可以更倾向于相信 gamecore 的计算结果。一旦出现不同步,只要 gamecore 和其中部分客户端的计算结果一致,就可以将 gamecore 的状态下发到客户端中。如果 gamecore 与所有玩家的状态都不一致,那么就要考虑 gamecore 的健壮性和正确性了,应该通过 log 及时发现并排除这样的状况。
如上的 gamecore 设计,也是一个反作弊的好解决方案。
gamecore 和状态同步?
帧同步主要是为了解决大量单位都需要同步的情况,比较少量的网络传输能够保证高度同步。gamecore 只是为了辅助客户端的状态计算,这样保证了同步的高效性。
finally
以上说的都是一些浅薄的个人之见,有什么不对的希望业界前辈不吝赐教!
帧同步 java_游戏同步方案——帧锁定同步相关推荐
- 内部同步 外部同步 java_如何用匿名内部类实现 Java 同步回调
在一个应用系统中,不论使用何种编程语言,模块之间要进行调用,仅存在三种方式:同步调用.异步调用.回调.本文就其中回调方式进行详细解读,并通过匿名内部类的手段,在最后实现一个同步回调的过程. 一.回调的 ...
- 外网数据同步到内网方案_数据同步之解决方案
关于数据同步的需求,想必是开发人员都可能遇到!下面就聊聊关于数据同步的解决方案: 一.使用中间表:数据生产者将数据放在一个中间库,数据消费方定时的去这个中间库取数据,用来消费这些数据, 但是这中方案并 ...
- 多人网络游戏服务器开发基础学习笔记 I:基本知识 | 游戏设计模式 | 网游服务器层次结构 | 游戏对象序列化 | 游戏 RPC 框架 | 帧同步和状态同步
今天继续开新坑,尽管过了很多 Unix 套接字编程的坑,但是实际还是有很多不同场景和性能的需求,以及最服务器架构的内容也就接触过 preforking 和 master 带 worker 而已. 所以 ...
- 游戏同步方案——帧同步
游戏同步方案--帧同步 帧同步(Lockstep)和状态同步(State Synchronization) 状态同步 帧同步 适用的游戏类型和代表作 帧同步的关键 运行环境一致 显示与逻辑分离 举个简 ...
- 网络同步在游戏历史中的发展变化(二)—— Lockstep与帧同步
前言: 网络同步属于游戏开发中比较重要且复杂的一部分,但是由于网上的资料内容参差不齐,很多人直接拿别人的结论写文章,导致很多人对这一块的很多概念和理解都是错误的.本文参考了大量的相关论文和资料(三十篇 ...
- 基于帧同步的游戏框架说明
基于帧同步的游戏框架说明 一,关于帧同步和状态同步的比较 帧同步 状态同步 安全性 比较差,计算都在客户端,服务器只做转发:有服务器校验的方案,比较繁琐 计算都在服务器 可以将重要的判定都由服务器决定 ...
- 帧同步与状态同步:王者荣耀的帧同步方案
以下为<王者荣耀>技术总监复盘回炉历程演讲全文 如今已经大获市场成功的<王者荣耀>一直是业内各方关注的对象,而我们也知道这款产品在成为国民级游戏之前,也遇到过一段鲜有人知的调优 ...
- 游戏中的网络同步机制(一)帧同步Lockstep
转载自:https://www.jianshu.com/p/64b3f162dcf4 参考游戏中的网络同步机制--Lockstep 一.前言 每个人或多或少都接触过网游,那个虚拟的世界给予了我们无穷的 ...
- 小球大作战 java_小球大作战-帧同步
帧数设定为40,每帧25MS 服务端 :基于Windows socket 的TCP,客户端:unity 基本原理,服务端轮询接受服务端发来的消息,在一帧时间内还没收到来自客户端的消息,那么就会默认收到 ...
最新文章
- Android开发系列之ListView
- python 去除所有的中文 英文标点符号
- Win7下使用U盘安装linux Ubuntu16.04双系统图文教程
- python selenium 下拉框 页面变化_python-selenium之select下拉框
- Vue+SpringBoot的微信登录
- Julia: 关于下载库时WinRPM的Bug
- 公众号内打开提示404_微信公众号文章“号内搜”新功能玩法
- 机器学习实战之路—— 1 线性回归 (二)
- Linux下安装vim命令
- oracle 查询数据的结果集导出
- 分区助手4.0绿色中文版
- 国标GB28181协议视频智能分析平台EasyCVR,构建智慧企业AR云景解决方案
- [翻译] 使用 TensorFlow 进行分布式训练
- python变量保存为.mat文件
- uni-app 不用onShow返回上一页刷新数据
- 黑苹果EFI文件,戴尔DELL-OptiPlex-7060and7070-Catalina
- 求100以内的素数(质数)用python
- 贪心算法之prim算法
- VS error C1083: 无法打开编译器生成的文件: Permission denied,link无法打开.ilk
- MT7621方案 LED 灯控制 (基于OpenWrt平台)