【笔记】状态同步笔记

2023-11-15

状态同步位置和技能(适用于fps和mmorpg类游戏)
客户端A的同步阀值(减少同步量)
    客户端A本地会存储一份对其他客户端看到的A的预测状态,当本地真实状态和预测状态偏差超过阀值时,则发起同步,同时更新客户端A本地的预测状态
    玩家运动的关键点也会同步,例如起跳坐标点,起跳最高坐标点,落地坐标点,开始跑步的速度方向,停止跑步时的坐标点
插值算法的选择
    客户端插值 和 航位推测的选择
    航位推测只用于预测位移
    客户端插值(线性插值,3次样条插值,曲线的寻路(寻路这个可能会在同步频率低的游戏中使用))
    使用航位推测:不做服务端的延迟补偿时,可以对客户端A上的第三方代理对象做航位预测
        客户端A上看到的玩家B的移动
            客户端A看到的第三方玩家B一直向着A接收到的服务端发来的B的数据包的最新状态插值,当客户端B走到最新状态,还是没有再次接收到服务器的数据包时,会按上一个移动操作包进行运动,直到再次收到B的数据包,则去检测是否有错误
        客户端A上玩家B的移动预测错误时的纠正
            A接收到服务端的数据包时检测到B在客户端A上的模拟有错误时,有以下处理方法
                1.距离远则瞬移表现层,适用于快节奏的游戏
                2.距离近则插值,可以用3次样条插值,适用于快节奏的游戏
                3.如果是突然加速这种,可以加二阶参数(例如加速度)去处理,例如插值时增大加速度,接近航位推测近似值时降低加速度
    使用插值:做了服务端延迟补偿时,服务端需要精确的计算出被射击的玩家的位置,需要通过帧数和插值进度去计算,所以此时不能用航位预测        
        一般类似fps需要优化射击方体验的游戏中需要延迟补偿,此时远程玩家使用客户端插值,而不是用航位推测
        在客户端A看到的第三方对象B,例如B此时从第3帧的状态插值到第6帧(帧状态是服务端下发的,且客户端更新频率和服务端更新频率保持一致,一般是1秒30帧)
        A开枪射击B时,发起射击请求,请求包内会有A在XX坐标,以XX角度,B从第3帧,插值到第5帧,当前插值进度XX
        服务端收到包后,根据缓存的前几帧的状态和插值的帧以及插值进度去计算A开枪时看到的B所在的位置,再做命中检测
客户端A接受到A的状态数据包时的处理(移动)
    客户端发起移动包,同时客户端记录下这个操作(客户端utc时间和操作),客户端本地立刻开始移动(此时是客户端的移动预测)    
    RTT时间后接收到服务端发来的数据包,将这个数据包内的时间戳和整个数据包状态存储起来
    因为接收到的数据包里的状态会比当前服务器状态慢大概半个RTT,所以需要本地模拟预测半个RTT的移动
    根据数据包里的服务端发起的utc时间 + 服务端和客户端的时间差,得到客户端对应的服务端发起这个数据包的时间点
    然后客户端从记录下来的自己的移动操作列表中得到这个时间点之后所有服务端未加入计算的移动操作
    通过数据包(指定时间在哪个坐标)+服务端计算出这个数据包时未计算的操作(也就是客户端这个时间点后的其他操作)
    计算出在当前时间应该在的状态C(位置,方向,旋转等),然后向C状态进行插值
    (如果移动的中途没有被其他玩家影响的话就是精确的,即使有误差也会很小(例如被技能打中晕眩之类的)),被其他玩家操作影响后也会发同步消息到客户端,客户端再纠正
玩家B施法,客户端A看到玩家B是怎么施法的
    会有延迟,也就是玩家B在客户端B按下施法,客户端A看到的玩家B至少也是RTT时间后才会播放施法动画
玩家A施法,客户端A看到玩家A是怎么施法的
    按下施法按钮,先播放前摇,前摇时间至少是RTT,接收到返回的数据包时,如果不能施法则停止施法动画,如果能施法则继续动画,以及播放后续施法效果(例如射出飞弹)
服务端延迟补偿
    服务端会记录之前的n帧的世界状态
    服务端接收到玩家A的施法包时,从包中取出客户端发起的utc时间戳t1,加上服务端和客户端的时钟差后得到玩家A在发起操作时服务端的时间t2
    那么用t2去取之前记录下来的世界状态
掩盖不同步的技巧以及优化
    优化命中表现:添加攻击边缘模糊的特效,数据层上会击中的攻击,因为表现层还在插值,所以如果没有特效,看起来是不会击中的,但因为有范围模拟的特效,所以表现上就跟击中了一样
    优化预测:前摇时间的调整
    为了预测效果更好,某些情况下可以信任客户端
    降低延迟
        选择更近的服务器节点(需要负载均很)
        让服务器和客户端tick的速度更高(需要衡量性能压力)
        尽量减少服务端和客户端接收到输入时的缓存buffering处理
客户端平滑插值(平滑处理位移的做法会在整个同步过程中的方方面都用到)
    接收到消息包(包含时间戳以及正确的位置P1)后,和本地记录的该时间戳的位置对比,如果相同则不处理。
    如果不同则,数据层从P1位置开始按已经记录下来的这个时间戳之后的操作包进行移动,然后得到客户端预测的数据层位置。
    和当前表现层的位置进行比较,距离远就瞬移,距离近就插值(如果是直接拉回,不进行P1+预测包的预测处理的话,表现上看起来会莫名其妙的拉回到以前的一个位置,网络差时基本就不会移动了)
体验上分为:对人战斗的体验和单击打怪的体验
优化了延迟后仍然会有的问题
    fps中看A玩家看到自己已经躲到了掩体后,仍然被命中。原因如下:
        1是A的操作还没发到服务端,虽然看着是进了掩体,但在服务端看来是没有躲在掩体后的
        2是fps如果做了服务端的延迟补偿,则B开枪射A,B看到的A是滞后服务端半个RTT的且正在插值的对象,此时如果B的网络很差,则A躲进掩体后,B还是能看到A且命中A
    不停移动的玩家会更难射中,因为即便做了以上的优化后,仍然会有误差
整体流程来看:
    按下鼠标到网络packet发出--客户端帧数越高越好
    网络延时(ping)--延时最大头
    服务器上面buf

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

【笔记】状态同步笔记 的相关文章

  • Java与代码检查与自动化测试

    Java是一种面向对象的编程语言 具有简单 快速 安全 可靠等特点 在Java编程中 代码质量的好坏直接关系到最终软件的质量 为了确保代码质量 我们需要进行代码检查和自动化测试 本文将详细介绍Java代码检查和自动化测试的概念 原则 工具及
  • 【DRAM存储器五】DRAM存储器的架构演进-part2

    个人主页 highman110 作者简介 一名硬件工程师 持续学习 不断记录 保持思考 输出干货内容 参考书籍 Memory Systems Cache DRAM Disk 目录
  • TCP的粘包问题

    TCP transport control protocol 传输控制协议 是面向连接的 面向流的 提供高可靠性服务 收发两端 客户端和服务器端 都要有一一成对的socket 因此 发送端为了将多个发往接收端的包 更有效的发到对方 使用了优
  • python pyinstaller打包参数介绍(转)

    pyinstaller相关参数 F onefile 打包一个单个文件 如果你的代码都写在一个 py文件的话 可以用这个 如果是多个 py文件就别用 D onedir 打包多个文件 在dist中生成很多依赖文件 适合以框架形式编写工具代码 我
  • 如何使用yum安装最新软件包

    分享请标明来自 https www css3 io how yum install release soft html 背景 使用yum安装软件时 会经常遇到安装的软件是老版本的 被非自己期望的release版本 这到底是怎么回事儿 得从r

随机推荐

  • 【2023】java通过modbus4j实现modus TCP通讯

    Modbus通信协议 主要分为三个子协议 RTU ASCII TCP Modbus RTU 传输的是字节数组 bit 通信 读写 输出 可以读写 输入 只能读 存储区 输出线圈 输入线圈 输出寄存器 输入寄存器 线圈 代表一个布尔量 最小单
  • Docker环境安装

    Docker环境安装 Docker简介 Docker工作原理 Docker的应用场景 Docker 的优点 CentOS Docker 安装与配置 Docker 安装 Docker 配置 Docker容器概念 Docker容器操作 拉取镜像
  • Java 实现文件复制及文件夹复制

    在Java中 有多种方法可以实现文件的复制 以下是几种常用的方式 使用字节流进行复制 通过FileInputStream和FileOutputStream分别创建源文件和目标文件的输入输出流 然后通过循环读取源文件内容 并将数据写入目标文件
  • mysql相加并输出_用shell把执行的两条sql语句相加并输出数据库名和相加的值以tab健隔开...

    SELECT SUM PresentSum FROM Lg ConsumeDetail0 WHERE ConsumeDate lt 2016 11 01 AND OpId 300 SELECT SUM PresentSum FROM Lg
  • vcpu和physical cpu 绑定

    参考libvirt中xml的写法可以将vpu和物理cpu 绑定 https libvirt org formatdomain html elementsCPUTuning
  • Unity鼠标光标使用学习

    Unity下的鼠标光标程序相关的就一个类下的2 3个方法 首先 光标导入图片的设置需要将类型设置为Cursor 设置鼠标光标的方法就一个 SetCursor 第一个参数是图片 第二个参数是点击点的偏移量 第三个参数是类型 public Te
  • Apollo配置中心Client源码学习(二)-- 配置同步

    上一篇文章 https blog csdn net crystonesc article details 106630412 我们从Apollo社区给出的DEMO开始逐步分析了Apollo客户端配置的创建过程 作为Apollo配置中心Cli
  • Javascript和CSS的标签属性对应表

    在写javascript中 经常要用到style对象的css属性 很多不记得 其实很好记 基本就是CSS中的 转化为javascript的驼峰写法 除了注意下float 盒子标签和属性对照 CSS语法 不区分大小写 JavaScript语法
  • 针对博客项目进行web自动化测试

    web自动化测试针对博客项目 项目功能 测试计划 功能测试 编写测试用例 使用Selenium Junit5进行Web自动化测试 创建测试套件类 博客登录页 博客列表页 主页 博客详情页 个人博客列表页 修改密码页 编辑博客页 退出驱动 屏
  • 台达plc控制伺服电机编程实例_PPT图文讲解PLC控制系统的设计及编程实例

    今天主要是关于PLC控制系统设计 分成四个方面 以图文的形式来为大伙做讲解 一 PLC控制系统设计概述 二 PLC控制系统设计 三 PLC的安装 运行与维护 四 PLC的编程实例 一 PLC控制系统设计概述 1 系统设计的原则 2 系统设计
  • chooseAddress:fail the api need to be declared in …报错解决方法

    在app js中与pages同级添加 requiredPrivateInfos getFuzzyLocation choosePoi chooseAddress 如果提示无效的json文件 在顶部工具栏 微信开发者工具 检查更新 更新到最新
  • 一致性算法(paxos、raft)

    背景 分布式 一致性模型 1 弱一致性 最终一致性 1 1 DNS 1 1 Gossip 2 强一致性 2 1 同步 2 1 paxos 2 1 raft multi paxos 2 1 ZAB multi paxos 与raft相似 心跳
  • error C2144: 语法错误:“int”的前面应有“;”

    error C2144 语法错误 int 的前面应有 C error C2144 syntax error int should be preceded by 注 我使用VS2010时 遇到的问题 解决办法 在某个 h文件里你自定义的某个类
  • 软件工程的发展历程及展望

    软件工程发展至今 催生出了许多优秀的编程语言和编程思想 本文将带领大家一起了解软件工程经历的四个阶段 汇编语言表达业务逻辑 过程化语言表达业务逻辑 面向对象和模块化思想表达业务逻辑 服务化和组件化表达业务逻辑 最后谈一谈未来可能的发展方式
  • 刷脸支付是新奇的安全的支付体验

    扫脸支付 刷脸付钱的新奇 便利 有效率和安全的支付体验 能够大大提高客户对刷脸商品的和信赖度 刷脸不仅仅在过程中时间 还将吸引消费者注意力的时间延长了5秒到8秒右左 这几秒就会有巨大的商业价值 是让顾客同商家的经营生产有效多维 充分接触的5
  • OSI/RM七层参考模型---开放式的系统互联参考模型

    一 OSI的设计目的 OSI模型的设计目的是成为一个所有销售商都能实现的开放网路模型 来克服使用众多私有网络模型所带来的困难和低效性 OSI是在一个备受尊敬的国际标准团体的参与下完成的 这个组织就是ISO 国际标准化组织 什么是OSI OS
  • 一个很好用的 vue-picker组件

    vue picker a picker componemt for vue2 0 走了一圈 github 都没有找到自己想要的移动端的 vue picker的组件 于是自己就下手 撸了一个出来 感受下效果图 demo demo 地址 htt
  • Gradle查看第三方依赖关系图

    1 使用Android Studio Terminal 配置变量 前提是 java 和 Android Sdk配置正确 java version adb 进行验证 增加 变量名 GRADLE HOME 变量值 D gradle gradle
  • 期货开户不要过度交易

    不同状态下的心态管理 若你在昨日的交易中有所斩获 那恭喜你取得了小阶段的胜利 你可以自信而放松 但却不可忘乎所以 请记得你做出正确决策时的感觉 并重复此状态在你的下一次交易中 只有在交易时集中注意力观察行情变化 勇敢果断地应对突发变化 你才
  • 【笔记】状态同步笔记

    状态同步位置和技能 适用于fps和mmorpg类游戏 客户端A的同步阀值 减少同步量 客户端A本地会存储一份对其他客户端看到的A的预测状态 当本地真实状态和预测状态偏差超过阀值时 则发起同步 同时更新客户端A本地的预测状态 玩家运动的关键点