【muzzik 分享】Cocos 物理帧同步

news2025/1/22 18:02:36

# 前言

之前没研究帧同步,这是我前端时间没上班时边玩边搞做的 Demo 研究成果,总共时间一周(实际2-3天),发布的目的也很简单,打破技术垄断,才能诞生更高端的技术成果。而且就算我没发这篇帖子,迟早也会有相同想法的人发布

# 帧同步

这里我不会说太多,网上也有很多教程,我并没有看太多,只是说说自己的看法

1. 了解帧同步

同步操作而不是状态

帧同步简单的说就是同步玩家的操作而不是状态,比如向服务器发送我按下了什么按键就是传递操作,而发送位置数据就是传递状态。

保证同步一致性

帧同步为什么叫帧同步?因为客户端的游戏进程是根据服务器下发的帧数据推进的,每下发一帧则更新一次游戏,确保了所有客户端展示一致

  1. 问题:服务器需要发送什么数据给客户端?
    答案:当前帧下标,所有玩家的操作数据

  2. 问题:客户端怎么发送操作数据到服务器?
    答案:统计当前帧产生的操作,在下一帧统一发送给服务器,在这里客户端需要筛除无用数据,例如只能执行一次的两个相同操作数据。

重连

帧同步需要服务器缓存从游戏开始到当前为止玩家的操作数据,然后在玩家重连时将所有数据发给客户端,客户端则根据帧数据同步游戏直到和当前帧一致,才算重连成功,所以这也是为什么帧同步游戏重连时间长的原因

相信到这里你已经简单了解了帧同步的原理。那么我们继续进行了解怎么做物理帧同步。

2. 帧同步的优化

预测和回滚

预测:就是按照你的游戏逻辑预测玩家的操作,例如 lol 网络卡时候的惯性移动就是预测

回滚:在预测之前记录当前数据,接收到服务器帧数据后,如果结果和预测结果一致则不回滚,不一致则用记录数据回滚到之前的状态

# 物理帧同步

1. 已知规则

  • JavaScript 的浮点基础运算在各个平台是一致的(遵守ECMAScript 2015 (ES6))

https://stackoverflow.com/questions/42181795/is-ieee-754-2008-deterministic

  • JavaScript 三角函数是提供了建议实现,实际只需要达到近似值即可满足要求,所以在各个平台可能并不一致

https://262.ecma-international.org/6.0/#sec-function-properties-of-the-math-object

https://forum.cocos.org/t/topic/155837

  • WASM 的浮点运算是确定性的

https://forum.cocos.org/t/topic/155837/4

  • C++ 的浮点数运算需要确保相同的架构和编译器才能确保一致

https://stackoverflow.com/questions/20963419/cross-platform-floating-point-consistency

2. 帧同步

  • 手动物理引擎步进:非手动控制步进会导致物理世界运算(step)次数不一致,导致最终的结果差异
    设置自动步进:cc.PhysicsSystem2D.instance.autoSimulation = false;
    cc.PhysicsSystem2D.instance.enable = false 需要在脚本加载时被执行,防止物理世界自动执行 step

  • 预测:使用渲染预测,物理世界依旧暂停,只控制渲染移动。回滚时只需要控制渲染位置即可

  • 确保物理世界数据的一致性:在 Cocos 的物理引擎实现中,通常只是做一个接口同步物理和渲染,所以物理引擎内还存在刚体的坐标与旋转数据。为了确保多端的物理世界数据一致,需要确保节点的 世界坐标世界旋转 在多端一致,具体可以自行查看物理引擎的 syncSceneToPhysics 实现。
    在这里插入图片描述

  • 重置物理引擎实例:个人推测也是因为设备间物理世界运算次数不一致导致的。解决方式为要么根据服务器指令结束物理循环(运算相同次数),要么重置物理引擎实例
    https://forum.cocos.org/t/topic/136991?u=1226085293

3. Web 帧同步

  • 修改三角函数:在我个人测试中,safari 和 chrome 的表现结果一致,但由于三角函数的不确定性,建议还是修改三角函数为确定性实现。并不一定需要使用查表法(提前存储结果),由于 JS 四则运算的一致性,我们可以使用 JS 自身实现,这里推荐使用 stdlib 库。

  • 检查物理引擎源码:在部分物理引擎中,为了更快的速度,有些会使用 let xxx = Math.cos 这种方式调用数学库实现。所以需要检测物理引擎源码,例如 box2d 就是这样
    在这里插入图片描述

4. 原生/多端 帧同步

  • 使用 js 或者 wasm 类型的物理引擎,C++ 需要保证相同架构和编译器,才能防止语言带来的浮点数差异

  • 使用定点数物理引擎,例如 repper.js
    https://forum.cocos.org/t/topic/133618/44

如果想要确定 Web 和 原生使用的物理引擎是否为同一语言,可以自行查看引擎原生代码是否包含这个物理引擎,例如 Physx 就有 C++ 版本

引擎 Web 代码路径:resources\resources\3d\engine\cocos
引擎原生代码路径:resources\resources\3d\engine\native\cocos

示例项目

只做了简单的同步,没做追帧、预测、回滚
服务端 Nodejs

https://github.com/1226085293/PhysicalFrameSynchronization

测试环境:Safari + Windows Chrome

参考资料

  • 理解确定性:https://shaderfun.com/2020/10/25/understanding-determinism-part-1-intro-and-floating-points/

# 结语

对于有物理同步需求的回合制游戏来说,你甚至不需要帧同步,只需要做到上面说的要求,一样可以做到物理同步,例如 台球

好了,快去做出你心仪的游戏吧,不必为技术困扰,另外加入我技术群的小伙伴可以提前知道我发布的最新技术成果哦。

🐧企鹅2群:348096019
🐧企鹅群:200351945

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1667151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

The 2023 ICPC Asia Hefei Regional Contest

目录 B. Queue Sorting 应该还会再补几题 B. Queue Sorting 题解: Dilworth定理: 【偏序关系与偏序集、Hasse图、极大元、极小元、全序关系、最大元、良序集/三小时讲不完离散数学之集合论/考研复试/期末复习考前冲刺/近世代数/抽象代数】https://www.bilibili.c…

【ARM 嵌入式 C 入门及渐进 16.1 -- C 代码实现CRC32校验函数】

请阅读【嵌入式开发学习必备专栏】 文章目录 CRC32校验函数CRC32 表与函数CRC32 测试函数测试结果 对比测试结果 CRC32校验函数 在C语言中,实现CRC32计算的函数需要一个CRC算法的实现。以下是一个使用查表法实现CRC32的简单例子。这种方法通过预先计算好的CRC表来快…

推导 模型矩阵的逆转置矩阵求运动物体的法向量

一个物体表面的法向量如何随着物体的坐标变换而改变,取决于变换的类型。使用逆转置矩阵,可以安全地解决该问题,而无须陷入过度复杂的计算中。 法向量变化规律 平移变换不会改变法向量,因为平移不会改变物体的方向。 旋转变换会改…

Excel办公技巧之下拉菜单

在日常办工中,经常需在单元格中输入特定的值,此时我们可以使用下拉菜单解决,输入错误和错误值,可以一劳永逸的解决固定数据输入问题。 使用Excel下拉菜单时,它在数据输入和验证方面发挥着重要作用通过点击单元格的下拉…

Mp3tag for Mac:音乐标签,轻松管理

还在为杂乱无章的音乐文件而烦恼吗?Mp3tag for Mac,让您的音乐库焕然一新!它支持多种音频格式,批量编辑标签,让音乐管理变得简单高效。同时,自动获取在线数据库的音乐元数据,确保您的音乐库始终…

8种区块链开发者必须知道的顶级编程语言!

我来问你一个问题:请说出一种技术,它以去中心化、不可篡改和透明性等核心特征席卷了全球。 这个问题的答案是,当然是区块链,它在近些年进入大家的视野并颠覆了工商业,没有任何其他技术能够做到这一点。 预计从2020年…

Linux-vi、vim

使用Xshell远程登录到Linux主机进行操作 命令行不用全部掌握, 一般编辑大文件,比较复杂的情况下, 我们还是使用Xftp工具, down下来再恢复回去。

1065: 无向图的连通分量计算

解法&#xff1a; dfs求连通性 1.设节点表vis[] 2.遍历节点表dfs标记&#xff0c;每次得到一个连通分量 #include<iostream> #include<vector> using namespace std; int arr[100][100]; void dfs(vector<bool>& vis, int v) {//不用终止条件&#x…

day10-Set集合

1.Set 那接下来我们来看Collection单列集合体系的第二部分 Set集合。 1.1 Set集合概述和特点 Set集合特点 1.可以去除重复 2.存取顺序不一致 3.没有带索引的方法&#xff0c;所以不能使用普通fori循环遍历&#xff0c;也不能通过索引来获取&#xff0c;删除Set集合里面的元…

WebSocket 详解加入门实操理解加深

WebSocket 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接…

基于SpringBoot的竹宣非遗宣传网站

摘要 随着互联网的普及和数字化时代的到来&#xff0c;竹编等非物质文化遗产的保护与传承面临新的机遇和挑战。该研究旨在使用SpringBoot后端框架与Vue前端框架&#xff0c;构建一个竹编非遗宣传网站&#xff0c;通过丰富的展示形式和交互体验&#xff0c;提升公众对竹编这一非…

怎么解决端口被占用

目录 一、引言 二、解决方法 一、引言 最近用vscode写网页&#xff0c;老是遇见端口被占用&#xff0c;报错如下&#xff1a; listen tcp :8080: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted. 二、解决方法 1.换…

OpenHarmony 实战开发 - 如何在源码中编译复杂应用(4.0-Release)

文档环境 开发环境&#xff1a;Windows 11 编译环境&#xff1a;Ubuntu 22.04 开发板型号&#xff1a;DAYU 200&#xff08;RK3568&#xff09; 系统版本&#xff1a;OpenHarmony-4.0-Release 功能简介 在 OpenHarmony 系统中预安装应用的 hap 包会随系统编译打包到镜像中&a…

数字水印 | 基于小波变换的数字水印技术

&#x1f34d;原文&#xff1a; 基于小波变换的数字水印技术 &#x1f34d;写在前面&#xff1a; 本文属搬运博客&#xff0c;自己留存学习。 正文 小波变换 把一个信号分解成由基本小波经过移位和缩放后的一系列小波&#xff0c;它是一种 “时间——尺度” 信号的多分辨率分…

# 从浅入深 学习 SpringCloud 微服务架构(十七)--Spring Cloud config(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十七&#xff09;–Spring Cloud config&#xff08;1&#xff09; 一、配置中心的 概述 1、配置中心概述 对于传统的单体应用而言&#xff0c;常使用配置文件来管理所有配置&#xff0c;比如 SpringBoot 的 application.y…

面试中算法(金矿)

有一位国王拥有5座金矿&#xff0c;每座金矿的黄金储量不同&#xff0c;需要参与挖掘的工人人数也不同。 例如&#xff0c;有的金矿储量是5ookg黄金&#xff0c;需要5个工人来挖掘;有的金矿储量是2ookg黄金&#xff0c;需要3个工人来挖掘...... 如果参与挖矿的工人的总数是10。…

HTTP 连接详解

概述 世界上几乎所有的 HTTP 通信都是由 TCP/IP 承载的&#xff0c;客户端可以打开一条TCP/IP连接&#xff0c;连接到任何地方的服务器。一旦连接建立&#xff0c;客户端和服务器之间交换的报文就永远不会丢失、受损或失序 TCP&#xff08;Transmission Control Protocol&…

【大数据】HDFS、HBase操作教程(含指令和JAVA API)

目录 1.前言 2.HDFS 2.1.指令操作 2.2.JAVA API 3.HBase 3.1.指令操作 3.2.JAVA API 1.前言 本文是作者大数据专栏系列的其中一篇&#xff0c;前文中已经详细聊过分布式文件系统HDFS和分布式数据库HBase了&#xff0c;本文将会是它们的实操讲解。 HDFS相关前文&#x…

商家转账到零钱怎么开通?一步步教你玩转微信营销新利器

在数字化营销日新月异的今天&#xff0c;微信支付凭借其便捷、安全的特点&#xff0c;成为了商家不可或缺的支付工具。而其中的“商家转账到零钱”功能&#xff0c;更是为商家提供了一个全新的营销利器。今天&#xff0c;我们就来详细解读一下如何开通这一功能&#xff08;我处…

强化学习在一致性模型中的应用与实验验证

在人工智能领域&#xff0c;文本到图像的生成任务一直是研究的热点。近年来&#xff0c;扩散模型和一致性模型因其在图像生成中的卓越性能而受到广泛关注。然而&#xff0c;这些模型在生成速度和微调灵活性上存在局限。为了解决这些问题&#xff0c;康奈尔大学的研究团队提出了…