零基础学CocosCreator·第九季-网络游戏同步策略与ESC架构

课程里的版本好像是1.9,目前使用版本为3.8.3
开始~

目录

  • 状态同步
  • 帧同步
  • 帧同步客户端
  • 帧同步服务端
  • ECS框架概念
    • ECS的解释
    • ECS的特点
    • Entity
    • Component
    • System
    • World
  • ECS实现
    • 逻辑帧&渲染帧
  • ECS框架使用
  • 帧同步&ECS

状态同步

一般游戏的同步策略有两种:状态同步帧同步
如下时序图为状态同步
在这里插入图片描述

  • c1操作从a走到b再走到c,因为不必关注细节所以c1将a走到c这个信息告诉给服务端
  • 服务端验证这个操作是否合规,将验证结果告诉回c1
  • 同时服务端还将这个信息转发给了c2和c3
  • c2网络比较快,立刻收到了这条数据,根据插值模拟,模拟出c1从a走到c的动作(当然如果请求频率够快将a到b和b到c都告诉了c2,那就模拟的更精细)
  • c3因为网络较慢,过了很久才收到服务端的数据,此时c1已经做下一个动作了,那c3就会采取一个瞬移或加速的方式模拟c1的移动

优点:

  1. 容易断线重连(因为数据都在服务端)
  2. 容易防外挂(因为逻辑都在服务端)
  3. 简单粗暴(客户端只需获取服务端数据并展示)

缺点:

  1. 服务器压力大(需要承担很大的计算量)
  2. 流量大(数据均由服务端传送过来)
  3. 不同玩家屏幕表现不一样

帧同步

帧同步的计算全部在客户端,服务端只负责做每帧收集操作,合并操作并且转发
那么问题来了,怎么保证所有客户端结果相同?
相同输入 + 相同逻辑 = 相同结果
逻辑层和显示层的分离
在这里插入图片描述

  • 同一帧,c1想要移动,c2想要进行攻击,他们将数据都发送给了服务端
  • 服务端只进行合并转发,给两个客户端
  • c1收到了c1想要移动,c2想要攻击的数据,并进行模拟
  • c2同样收到了c1想要移动,c2想要攻击的数据,并进行模拟
  • 下一帧中客户端都没有操作,没有数据传给服务端,服务器同样进行发送操作

注意:

  • 现代网游用这种模式,当c2掉线了,服务端仍然逐帧执行,c1并没有受到影响
  • 而老代网游模式,每一帧客户端都需要给服务端传送数据(没操作也要传),当c2掉线后,服务端发现收不到c2的数据就会锁帧,所有客户端都需要等待,直到再次所有客户端的数据
  • 再老代网游,如果有一个客户端网速很慢,客户端就会拉长帧时间去保证每个客户端的帧更新是同步的,会导致网速快的客户端也很慢

优点:

  1. 流量低(所有逻辑都在客户端)
  2. 方便做录像功能(直接客户端再次执行运算逻辑即可)
  3. 服务器逻辑简化
    缺点:
  4. 有可能作弊
  5. 需要保证各端运算结果一致性(比如随机数,无限小数等)
  6. 实时性要求比较高(帧同步的特点就是每秒同步很多次)
  7. 断线重连需要重新跑所有逻辑(可优化)

状态同步和帧同步比较
在这里插入图片描述

帧同步客户端

客户端职责:

  1. 玩家操作不直接处理,而是发送给服务器
  2. 收到服务器一帧数据,模拟一帧
    (?帧同步但是逻辑在服务端)

[代码实现]在下面👇

帧同步服务端

具体步骤可以看之前的文章
还是再总结一下:

快速开始NodeJs项目 npm init -y
安装TS npm install typescript --save-dev
安装WS npm install ws --save-dev
安装提示 npm install @types/ws --save-dev
生成tsconfig.json tsc --init
安装即时编译 npm install ts-node --save-dev
添加nodemon npm install nodemon --save-dev

服务端职责:

  1. 把玩家加入到一局游戏中,下发初始消息
  2. 每一帧收集操作,合包转发

代码实现(客户端+服务端)

ECS框架概念

ECS的解释

  • E - Entity 实体
  • C - Component 组件
  • S - System 系统

ECS的特点

  • 网络-数据-逻辑-显示层相互独立
  • C/S端可以运行同一份逻辑代码,方便验证作弊
    服务端没有creator内api,逻辑显示放在一起的话,服务端跑不了
  • 可以方便的进行预测和回退

Entity

  • 每个Entity对象都有不同的EntityId
  • Component挂在的对象,同种类型的Component只能拥有一个
  • 提供Component的增删查和备份

Component

  • Component只包含数据,不能拥有逻辑函数
  • Component挂载在Entity上
  • ComponentId使用不同的位来区分(因为Component操作比较频繁,所以需要使用位运算效率优化)
    位运算

System

  • System只拥有逻辑,不能包含数据
  • System拥有不同Type,比如逻辑帧System,渲染帧System
  • 依靠SystemType来确定执行顺序和每帧执行次数
  • onUpdate函数由系统自动触发,不能手动调用

World

  • ECS世界的入口,单例
  • 驱动System和Update
  • 提供Entity的增删查功能
  • 使用forEach根据ComponentId组合来遍历Entity

ECS实现

实现代码

逻辑帧&渲染帧

如下图,为一帧执行的内容和不同机器的运行速度

  • 我们期望1s内能执行60帧,每一帧执行一个逻辑帧和一个渲染帧,那就需要每一帧耗时不超过16.6ms
  • 高性能机器每一帧耗时16ms(8+8),可以满足1s执行60帧
  • 低性能机器每一帧耗时24ms(12+12),无法满足1s执行60帧,那就会优先执行逻辑帧,不执行渲染帧,去满足1s执行60次逻辑帧,保证高低性能机的逻辑次数一致,以确保执行结果相同

在这里插入图片描述

ECS框架使用

实现和使用放在一起了
使用ECS实现一个简单的demo(箭头旋转前进)
实现代码

帧同步&ECS

代码实现

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

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

相关文章

实现限制同一个账号最多只能在3个客户端(有电脑、手机等)登录(附关键源码)

如上图,我的百度网盘已登录设备列表,有一个手机,2个windows客户端。手机设备有型号、最后登录时间、IP等。windows客户端信息有最后登录时间、操作系统类型、IP地址等。这些具体是如何实现的?下面分别给出android APP中采集手机信…

算法基础:贪心|双指针|二分|倍增

贪心 算法思想: 把整个问题分解成多个步骤,在每个步骤都选取当前步骤的最优方案,直到所有步骤结束;每个步骤都不会影响后续步骤。 核心:采取局部最优,最终结果就全局最优。 双指针 反向扫描 同向扫描 二…

在本地校验密码或弱口令 (windows)

# 0x00 背景 需求是验证服务器的弱口令,如果通过网络侧校验可能会造成账户锁定风险。在本地校验不会有锁定风险或频率限制。 # 0x01 实践 ## 1 使用 net use 命令 可以通过命令行使用 net use 命令来验证本地账户的密码。打开命令提示符(CMD&#xff0…

【设计模式】【行为型模式】观察者模式(Observer)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 📫 欢迎V: flzjcsg2,我们共同讨论Java深渊的奥秘 &#x1f…

OSPF高级特性(3):安全特效

引言 OSPF的基础我们已经结束学习了,接下来我们继续学习OSPF的高级特性。为了方便大家阅读,我会将高级特性的几篇链接放在末尾,所有链接都是站内的,大家点击即可阅读: OSPF基础(1):工…

把 DeepSeek1.5b 部署在显卡小于4G的电脑上

这里写自定义目录标题 介绍准备安装 Ollama查看CUDA需要版本安装CudaToolkit检查Cuda是否装好二、设置Ollama环境变量三、验证是否跑在GPU上ollama如何导入本地下载的模型安装及配置docker安装open-webui启动open-webui开始对话介绍 Deepseek1.5b能够运行在只用cpu和gpu内存小…

WebSocket与Socket.io的区别

文章目录 引言一、WebSocket:原生的实时通信协议(一)WebSocket 是什么(二)WebSocket 的工作原理(三)WebSocket 的使用方法(四)WebSocket 的优势(五&#xff0…

STM32 裸机 C编程 vs micropython编程 vs linux python

以led点亮为例。 STM32 裸机 C编程需要设置时钟,管脚。 static void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0};// GPIO端口时钟使能__HAL_RCC_GPIOA_CLK_ENABLE();// 配置PA5为推挽输出模式GPIO_InitStruct.Pin GPIO_PIN_5;GPIO_InitStruct.M…

AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘

云边有个稻草人-CSDN博客 目录 第一章:DeepSeek与ChatGPT的基础概述 1.1 DeepSeek简介 1.2 ChatGPT简介 第二章:模型架构对比 2.1 Transformer架构:核心相似性 2.2 模型规模与参数 第三章:训练方法与技术 3.1 预训练与微调…

稀土抑烟剂——为汽车火灾安全增添防线

一、稀土抑烟剂的基本概念 稀土抑烟剂是一类基于稀土元素(如稀土氧化物和稀土金属化合物)开发的高效阻燃材料。它可以显著提高汽车内饰材料的阻燃性能,减少火灾发生时有毒气体和烟雾的产生。稀土抑烟剂不仅能提升火灾时的安全性,…

硅基流动平台大模型 DeepSeek API 调用示例

硅基流动平台大模型 API 调用示例 硅基流动平台作为一个集成多种主流开源大模型的云服务平台,为用户提供了便捷的 API 调用方式,让用户无需自建硬件或进行复杂配置,即可轻松使用各种大模型。以下是详细的硅基流动平台大模型 API 调用示例&am…

vue项目 Axios创建拦截器

Axios 1. Axios 和 Ajax 简介2. Axios 和 Ajax 的区别3. 从 按钮 到 Axios请求后端接口的 大致顺序 1. Axios 和 Ajax 简介 Ajax(Asynchronous JavaScript and XML) 不是一种技术,而是一个编程技术概念,核心是通过 XMLHttpReques…

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 代码下载:CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景及意义 随着全球能源危机和环境问题的日益严重,可再…

碳纤维复合材料制造的六西格玛管理实践:破解高端制造良率困局的实战密码

碳纤维复合材料制造的六西格玛管理实践:破解高端制造良率困局的实战密码 在全球碳中和与高端制造升级的双重驱动下,碳纤维复合材料行业正经历前爆发式增长。航空航天、新能源汽车、风电叶片等领域对碳纤维产品的性能稳定性提出近乎苛刻的要求&#xff0…

如何保证Redis和MySQL数据的一致性刨析

1、常见的缓存更新策略: 定义:主要用来进行redis和mysql的数据同步更新的一些策略 内存淘汰:等触发淘汰机制后,刚好淘汰到了用户查询的数据,此时是null,会进行查询数据库并写入到缓存中,此时…

Golang GORM系列:GORM 高级查询教程

有效的数据检索是任何程序功能的基础。健壮的Go对象关系映射包(称为GORM)除了标准的CRUD操作之外,还提供了复杂的查询功能。这是学习如何使用GORM进行高级查询的综合资源。我们将涵盖WHERE条件、连接、关联、预加载相关数据,甚至涉…

协议-LVDS

是什么? LVDS 全称为 Low-Voltage Differential Signaling,低电压差分信号 低功耗、低误码率、低串扰和低辐射的差分信号,采用-350mV~350mV极底的电压摆幅高速差动传输数据,实现点对点或一点对多点的连接 由于电压幅度低&#xf…

dma_ddr 的编写 通过mig控制ddr3

此外还有别的模块 本模块是 其中一个 timescale 1ns/1ps module dma_ctrl (input wire ui_clk , //100MHZ 用户时钟input wire ui_rst_n ,//写fifo的写端口 input wire wf_wr_clk , //由数据产生模块的时…

数据中心网络监控

数据中心是全球协作的特定设备网络,用来在internet网络基础设施上传递、加速、展示、计算、存储数据信息。 对于任何利用IT基础设施的企业来说,数据中心都是运营的核心,它本质上为整个业务网络托管业务应用程序和存储空间。数据中心可以是任…

w~大模型~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/13284996 #VideoMamba 视频理解因大量时空冗余和复杂时空依赖,同时克服两个问题难度巨大,CNN 和 Transformer 及 Uniformer 都难以胜任,Mamba 是个好思路,让我们看看本文是…