【网络游戏同步技术】帧同步的一致性

2023-11-12

【参考博文】GAD-网络游戏同步技术

引言

  帧同步的形式很泛,根据不同游戏,使用的技术范围又不一样,所以大家都在讲方法论,要全面覆盖可能需要较大的篇幅,所以,我简单描述下。

  假定大家对帧同步和状态同步有一定的认识,理论上的问题,我就不作过多解释了。

  大家都知道,帧同步的核心是一致性,通过一致性的算法,使得各端输入一致的情形下,输出也是一致的,以此,可以解决同步的根本问题——仲裁的结果是一致的。

  严格的帧同步,实现起来,解决算法一致性、输入一致性的问题基本就能实现了,然而实践过程中,由于网络延时、抖动、用户实时体验带来了一些其他的问题,使得问题解决起来变得更复杂,为了把问题聚焦,这部分内容我们就不重点讨论,后面的篇幅,主要聚焦在如何保证算法一致性和输入一致性。

1.算法一致性(或者确定性)

  算法不一致的主要原因是数值计算不一致和算法流程不一致。

数值计算。 
浮点数的运算精度,在不同机器上有不同的表现,由此,导致了浮点数的精度可能导致计算结果不一致。 
所以,首要问题是把游戏逻辑部分(后续会有关于逻辑和表现分离的说明)所使用的浮点数运算全部改成具有一致性的数值运算。

那么,怎么实现一种数值运算,既具有小数的表达能力,又有一致性的运算结果呢? 
常规方法中,尽管形态多样,但理论来讲,基本都是定点数(关于定点数的实现,可以翻看其他资料)。

工程上,还要考虑定点数的精度,不同的精度,性能可能不一样,如何在精度和性能之间做平衡,需要结合自己的数值范围来确定。

综上所述,我们导出需要实现的代码。 
实现1:定点数 
包含浮点数计算的常规算法,包含加、减、乘、除、绝对值、负运算等基本运算,另外,还要根据自己的使用实现开平方、指数函数、对数函数,三角函数等。 
其中定义域较大的函数,一般使用解方程的方法,比如牛顿法,定义域较小或者可以限制到一个周期以内的函数,比如三角函数,定义域在0-2pi,可以使用泰勒级数,具体用几阶,要根据自身对精度的要求,同时,由于有限项的泰勒级数只在某些定义域区间较好的拟合度,所以需要在通过数值分析来论证精度。最后,其实三角函数可以通过查表法来实现,性能快,精度与所需要存储的表格大小有关系。

至此,我们拥有了一致性的定点数,我们用它来替换浮点数,然后在有些应用场景,逻辑层也会使用到更多的数学工具,比如向量、矩阵、欧拉角、四元数等,所以我们得实现这部分数学工具。

实现2:一致性数学工具 
1. 向量、矩阵、欧拉角、四元数 
2.几何工具:点、线、面、体,各种几何元素的关系,相交性检测(做一个射击游戏,需要射线检测来判定是否命中),不是所有的都要写,用多少实现多少。

除了上述的内容,还有逻辑层可能用了物理,物理部分主要包含碰撞检测和动力学 
比如抛出一个篮球,带抛物线的,需要一致性的物理运算,篮球碰到框则需要一致性的碰撞检测,碰到框之后的反馈也可能需要动力学表现(这部分可以是表现层)。

实现3:一致性物理系统 
包含逻辑层需要使用的动力学和碰撞检测

有些游戏逻辑需要动画系统支持,比如动作游戏,一个技能触发一个动作,动作除了表现层的动画(比如2D游戏的图片序列),还有一些影响逻辑的部分,比如动画控制了攻击判定框在时间轴的变化,这个时候需要实现逻辑层上的动画,主要需要解决的问题是,时间要改成整数或者定点数,另外,插值数据的类型也得使用一致性得数据类型,比如位置向量等。

实现4:一致性动画系统 
与常规得表现层动画类似,可以根据需要简化。(比如不需要骨骼或者不需要融合)

数值一致性的常规问题大致说这么多,还有些其他的内容,比如寻路,AI判定等凡是有浮点数的地方,全部换成定点数,最终还是需要根据项目需求,选择需要实现的内容。

注意:定点数的运算性能比浮点数差很远,数量级在10-100以上,需要评估性能,好规划策划设定的问题规模。

前面讲到,算法不一致的另外一个原因是:流程不一致。 
流程不一致的主要原因,可能是输入导致的,也可能是架构导致的。

输入导致的算法流程不一致,这个问题,我们把它归到输入一致性,后面讨论。 
主要讨论架构导致的流程不一致。

首先,帧同步需要在架构上做逻辑和表现分离,那么,什么是逻辑,什么是表现,其实没有绝对的定论,一般来说,对游戏结果有影响的部分为逻辑,对游戏结果没影响,只影响视觉、听觉、和其他与游戏结果无关的用户交互的部分为表现。

整个帧同步的运行体系,简单的模型历程流程大致为: 
游戏框架跟从网络收取同步包->上传用户输入->分发同步包给逻辑内核(用户输入)->逻辑内核更新->逻辑内核发送消息给表现层->表现层更新

需要注意的几点: 
1.逻辑更新频度和表现更新频度不一致 
2.逻辑内核更新的时间片是等间隔的,表现不一定 
3.同步包的内容是所有用户在某个时间片以内的输入

容易出错的地方是,逻辑层和表现层交织在一起,表现层影响逻辑层,导致算法流程不一致。

所以,帧同步实施的第一要务是明确分离逻辑层和表现层。

输入一致性

  完了算法计算一致性,接下来,我们要讨论,输入一致性的问题。 
这里所说的输入比较笼统,整理讲的是逻辑层的输入,包含一些全局变量、随机数的种子等等,最重要的一个问题是,逻辑层每帧的时间间隔是固定的,没有特殊需求的话,建议用整数表示,精确为毫秒。

一致性的细节问题还有很多,先大概讲这么多吧。

解决了一致性问题,一个严格的帧同步模型,后续实施就相对轻松了。

强调下,为什么反复提“严格”的帧同步模型,因为实际运行过程中,很可能出现不严格的模型,当网络延时较大、抖动、以及游戏对输入响应有更高要求的时候,需要做一些预先的表现(表现层的预测),当结果预测不一致的时候,需要回滚,这个跟状态同步差不多,当然也有逻辑层的预测,算帧同步的高级应用,目前少有游戏使用。

最后,说下回放、断线、反外挂、注意事项

帧同步实现回放有天生的技术优势,因为有了一致性的保证,存储初始数据和用户输入,逻辑内核启动播放模式,将时间轴的用户输入,按照时间轴消耗即可。

断线其实是回放的变种,应用形态不一样,技术差不多,可以不驱动表现。

反外挂,帧同步的游戏结果是所有客户端一起说了算,算法一致性保证了大家的结果是一致的,可以简单使用少数服从多数的方式来判定谁用外挂,两方数量一致(或者差不多)的情形,可以使用部署在仲裁服务器上的逻辑内核来计算结果,以服务器为准。

注意事项 
帧同步适用的情形:参与玩家数量不多(人数影响单个同步包的大小) 
有利情形:各端需要同步的NPC数量众多、游戏逻辑运算量很大

大概就这么多,表达能力有限,感觉也没讲清楚,只是希望对你有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【网络游戏同步技术】帧同步的一致性 的相关文章

  • Unity-角色互动加分显示的实现

    文章目录 角色互动加分显示的实现 在角色的脚本里设置分数 布置页面以及编译对应的脚本 使用事件委托将两者连接 角色互动加分显示的实现 思路 在角色的脚本里对应该加分的地方用变量统计分数 同时再创建一个ui对象 然后用委派事件获取角色的得分
  • Unity进阶-消息框架的理论知识与实际操作学习笔记

    文章目录 Unity进阶 消息框架的理论知识与实际操作学习笔记 Unity进阶 消息框架的理论知识与实际操作学习笔记 笔记来源课程 https study 163 com course courseMain htm courseId 121
  • Unity -- 物体运动到某个地方自动销毁的实现 && 物体在某个点无限生成

    文章目录 物体运动到某个地方自动销毁 物体在某个点无限生成 创建空出生点 写随机生成的脚本 物体运动到某个地方自动销毁 using System Collections using System Collections Generic us
  • Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)

    文章目录 Unity进阶 通过PhotonServer实现人物移动和攻击 PhotonServer 五 DLc 消息类和通信类 服务器 客户端 Unity进阶 通过PhotonServer实现人物移动和攻击 PhotonServer 五 D
  • Unity--使用Cinemachine Confiner设置摄像机边界

    使用Cinemachine Confiner设置摄像机边界 前提提要 在做这个功能前需要 main camera 另外一个相机 思路 创建一个对象绑定Polygon Collider2D 边界 然后在另外一个相机Cinemachine Co
  • Unity如何开发微信小游戏

    微信小游戏现在非常的火 很多开发Unity的同学 都想自己开发微信小游戏 无奈tiny还不成熟 导致很多同学有自己创业做微信小游戏的想法 但是由于技术 却放弃了这样的机会 今天我给大家讲述unity同学如何转型做微信小游戏 1 解放思想 我
  • unity进阶--xml的使用学习笔记

    文章目录 xml实例 解析方法一 解析方法二 xml path 创建xml文档 xml实例 解析方法一 解析方法二 xml path 创建xml文档
  • 关于Unity-Web的Development build。

    Unity转手游之后是否该勾选development Build 首先看一看官方文档的解释 Development Build When you check the Development Build checkbox Unity gene
  • 帧同步(LockStep)该如何反外挂

    在中国的游戏环境下 反挂已经成为了游戏开发的重中之重 甚至能决定一款游戏的生死 吃鸡就是一个典型的案例 目前参与了了一款动作射击的MOBA类游戏的开发 同步方案上选择了帧同步技术 LockStep而非snapshots以下同 那么就有很多人
  • Unity3DAI行为------避开障碍物简单实现

    public float speed 20 0f public float mass 5 0f public float force 50 0f public float minimumDistToAvoid 20 0f private f
  • Unity 在编辑模式下退出游戏

    实现在编辑器环境下退出编辑器 在非编译器环境下退出游戏 我们需要判断当前是否在编辑器环境中 在unity中是使用预处理的方式判断当前的环境 常用的预处理标识符如下 标识符 解释 UNITY EDITOR 只在编辑器中编译 UNITY AND
  • 添加包和删除包&俯视角渲染&改变中心锚点的位置

    文章目录 如何添加包和删除包 如何俯视角渲染 如何改变中心锚点的位置 如何添加包和删除包 如何俯视角渲染 将z轴遮挡变为y轴遮挡 y轴为1表示以y轴为对比尺度 每个物体中心点y轴大的将会被中心点y轴小的物体遮掩 如何改变中心锚点的位置 把图
  • Unity——Transform类

    transform position 基础知识 Transform作为Unity中游戏对象最为重要的组件 位置 作为Transfrom组件的一个属性 具有同等重要的地位 Transform组件下有两个 位置 属性 position 指的是游
  • Unity简单几行代码让玩家水平移动更丝滑真实

    可以先来看看基础的移动代码 接收玩家的输入 然后赋予刚体速度 但是这种写法存在几个问题 下面一一纠正 首先 如果直接改变刚体的速度 那么可能会出现穿墙的问题 而且没有一种从速度0到缓慢加速的过程 那样较为机械且不真实 所以可以用物理模拟的方
  • Unity之UI

    Unity之UGUI 一 Canvas 1 创建Canvas 2 Render Mode 1 Screen Space Overlay 2 Screen Space Camera 3 World Space 3 Pixel Perfect
  • 【帧同步】关于状态同步的经验分享

    方案 低延迟环境下 比如国内 局域网情况下 写个同步那都不是难事 是个客户端看点书就会写了 难点在于 如何去处理 高延迟 以及及时响应的情况 我举个例子 fps或者tank游戏中 子弹和炮弹的射速是很快的 如果两边在对轰过程中 又碰到了 附
  • Unity进阶--声音管理器学习笔记

    文章目录 声音管理器 using System Collections using System Collections Generic using UnityEngine public class AudioManager MyrSing
  • Unity3D RPG实现 3 —— 对话、任务系统

    目录 成果展示 对话系统 对话的存储数据结构 对话的UI面板设置 创建对话 任务的 NPC 实现对话控制器显示主对话窗口的内容 创建对话的选项内容 任务系统 创建任务 UI 面板 任务的存储数据结构 任务管理器与接受任务 任务控制相关脚本
  • Unity进阶-ui框架学习笔记

    文章目录 Unity进阶 ui框架学习笔记 Unity进阶 ui框架学习笔记 笔记来源课程 https study 163 com course courseMain htm courseId 1212756805 trace c p k2
  • 15. unity官网资源商店的免费资源引入自己项目中

    1 说明 在unity开发中可以在官网引入一些免费的资源 免得自己找不到合适的素材 第一步 首先进入Unity资源商店官网 https assetstore unity com 计入并登录自己的unity账号 如果没账号 可以注册一个 然后

随机推荐

  • Vue技术—自定义指令

    自定义指令总结 一 定义语法 1 局部指令 new Vue directives 指令名 配置对象 或 new Vue directives 指令名 回调函数 2 全局指令 Vue directive 指令名 配置对象 或 Vue dire
  • Bitlocker恢复密钥验证方法

    在重装系统或者更新系统的时候可能会出现这个情况或者你的组织可能设有密码安全策略 在尝试登录失败超过一定次数之后便锁定 再或者可能是你的电脑遇到硬件故障 意外的配置更改或其他安全事件 需要恢复密钥可帮助确保仅授权人员才可解锁你的电脑并还原对你
  • Elasticsearch 安装和后台运行(真实有效,Mac版本已经验证)

    如何安装一个程序 在日常的工作和学习中 例如学习一个新技术 经常需要安装一些程序 那么这个时候 最推荐的就是区技术的官网 学习最新的安装方法 进行安装 一 Mac安装Elasticsearch 关于Elasticsearch的安装 在官网安
  • linux服务器创建root账户

    Linux创建root账户 创建普通账号 修改已经存在的普通账户为root账户 创建一个root类型的账号 创建普通账号 linux创建一个普通系统用户 useradd test 创建test用户 passwd test 创建 更新test
  • 贝叶斯分类器详解 从零开始 从理论到实践

    贝叶斯分类器详解 从零开始 从理论到实践 大纲总览 一 贝叶斯相关概念 1 1 频率学派和贝叶斯学派 1 1 1 频率学派 1 1 2 贝叶斯学派 1 2 概率论基础知识 1 3 贝叶斯定理 二 概率的分布 2 1 离散概率分布 2 1 1
  • 网络层协议(IP协议)

    1 IP层主要有如下作用 数据传输 将数据从一个主机传输到另一个主机 寻址 根据子网划分和IP地址 发现正确的主机地址 路由选择 选择数据在互联网上的传输路径 数据报文分段 当传送的数据大于MTU时 将数据进行分段发送和接收并组装 2 IP
  • C# 数据库介绍及基本操作

    数据库 Database 是按照数据结构来组织 存储和管理数据的仓库 主要作用 1 实现数据共享 2 减少数据的冗余度 3 实现数据独立 分类 相关联 便于集中控制 主流数据库种类 Oracle 甲骨文公司 大型数据库 SQL Struct
  • python 下实现xgboost 调参演示

    基于前阵子京东金融JDD数据探索大赛比赛拿下总决赛季军的经验 发现xgboost真的是一个很好的利器 精确度的提升是很疯狂的 从最远先使用的RF模型到XGBOOST模型 精确度可以说提升了0 3的跨度 相信很多人跟我一样都被xgboost惊
  • hihocoder #1000 : A + B Java实现

    时间限制 1000ms 单点时限 1000ms 内存限制 256MB 描述 求两个整数A B的和 输入 输入包含多组数据 每组数据包含两个整数A 1 A 100 和B 1 B 100 输出 对于每组数据输出A B的和 样例输入 1 2 3
  • 子序列问题

    子序列问题 双指针 动态规划 例题一 判断子序列 力扣392 链接 https leetcode cn com problems is subsequence 题目描述 给定字符串 s 和 t 判断 s 是否为 t 的子序列 字符串的一个子
  • 如何在Power Linux上运行AIX程序(实现验证,附源码开源地址)

    最后更新2021 01 21 静心研究了小半年 终于把原型验证搞定了 可以在Power Linux上直接运行AIX程序 当然 目前只是实现了POC 还有大量的工程工作 源代码地址 https gitee com HarryHurryHung
  • 不用==用equals引发的一系列思考

    毕业刚工作的时候 带我的小师傅给我说判断相等使用equals不要使用 第一次写java的我照办了 但是不清楚为什么 之后还是决定真正了解一下java本身 于是开始看jdk源码 这里以Integer为例 equal public boolea
  • 【Python】多分类算法—Random Forest

    Python 多分类算法 Random Forest 本文将主要就Random Forest 随机森林 的多分类应用进行描述 当然也可运用于二分类中 本文运用scikit learn框架 文章目录 Python 多分类算法 Random F
  • docker私有仓库

    一 docker私有仓库 1 拉取 docker pull registry 2 创建启动容器 docker run id name registry p 5000 5000 registry 3 浏览器输入地址 http ip 5000
  • 【Java】操作Sqlite数据库

    首先在https github com xerial sqlite jdbc下载jar包 import java sql Connection import java sql DriverManager import java sql Re
  • 01Linux常用指令

    所有的指令不要强制记忆 选项要多多查一下 多多练习使用即可 文章目录 一 Linux简单介绍 1 1 Linux的目录结构 1 2 常见的具体目录结构 bin sbin root lib etc usr boot tmp dev media
  • 从字符串中取出指定位置的字符

    首先肯定返回一个char类型
  • excel编写的测试用例转成xmind格式

    软件开发过程中 测试工程师必不可少的一项工作就是编写测试用例 进行测试评审 设计评审 用例评审 写用例常用的几种方法无非就是用excel写 或者xmind这种思维导图形式 而xmind具有条理清晰的特点 所以测试评审时为了提高效率 很多团队
  • 2023华为od机试 Python【不包含回文串】

    前言 本题使用python解答 如果需要Java版本代码 请参考 点我 题目 什么是回文串呢 就是将原字符串翻转过来 和原始字符串一样的字符串 我们现在有一个不包含回文串的字符串 并且 字符串的字符在英语字母的前N个 且字符串不包含任何长度
  • 【网络游戏同步技术】帧同步的一致性

    参考博文 GAD 网络游戏同步技术 引言 帧同步的形式很泛 根据不同游戏 使用的技术范围又不一样 所以大家都在讲方法论 要全面覆盖可能需要较大的篇幅 所以 我简单描述下 假定大家对帧同步和状态同步有一定的认识 理论上的问题 我就不作过多解释