零基础学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.rhkb.cn/news/17346.html

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

相关文章

最新版Edge浏览器集成ActiveX控件之金山WpsDocFrame控件

背景 WpsDocFrame控件‌是由金山公司开发的ActiveX控件,主要用于OA系统中,支持在浏览器中嵌入WPS文档的查看和编辑功能。 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有…

Win10系统IP地址修改_出现了一个意外的情况不能完成所有你在设置中所要求的更改---Windows工作笔记001

今天在修改win10系统中的ip地址的时候报错了 来看看如何解决吧,挺简单,简单记录一下 这个时候就需要使用cmd命令来修改 一定要使用,管理员权限,运行cmd才可以 然后首先: 输入 netsh 然后输入 ip 然后输入: set address "以太网" 172.19.126.199 255.255.255.0…

算法 ST表

目录 前言 一,暴力法 二,打表法 三,ST表 四,ST表的代码实现 总结 前言 ST表的主要作用是在一个区间里面寻找最大值,具有快速查找的功能,此表有些难,读者可以借助我的文章和网上的课程结…

node.js+兰空图床实现随机图

之前博客一直用的公共的随机图API,虽然图片的质量都挺不错的,但是稳定性都比较一般,遂打算使用之前部署的兰空图床,自己弄一个随机图 本文章服务器操作基于雨云——新一代云服务提供商的云服务器进行操作,有兴趣的话可…

CNN|ResNet-50

导入数据 import matplotlib.pyplot as plt # 支持中文 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号import os,PIL,pathlib import numpy as npfrom tensorflow import keras from tensor…

基于微型5G网关的石化厂区巡检机器人应用

石化工业属于高风险产业,由于涉及易燃易爆、有毒有害工业原料,为了保障企业的安全生产与持续运营,因此相比其它行业需要进行更高频次、更全面细致的安全巡检和监测。由于传统的人工巡检监测存在诸多不便,例如工作强度大、现场环境…

Docker+Jenkins自动化部署SpringBoot项目【详解git,jdk,maven,ssh配置等各种配置,附有示例+代码】

文章目录 DockerJenkins部署SpringBoot项目一.准备工作1.1安装jdk111.2安装Maven 二.Docker安装Jenkins2.1安装Docker2.2 安装Jenkins2.3进入jenkins 三.Jenkins设置3.1安装jenkins插件3.2全局工具配置全局配置jdk全局配置maven全局配置git 3.3 系统配置安装 Publish Over SSH …

知识图谱数据库 Neo4j in Docker笔记

下载 docker pull neo4j:community官方说明 https://neo4j.com/docs/operations-manual/2025.01/docker/introduction/ 启动 docker run \--restart always \--publish7474:7474 --publish7687:7687 \--env NEO4J_AUTHneo4j/your_password \--volumeD:\files\knowledgegrap…

前缀和算法篇:解决子数组累加和问题

1.前缀和原理 那么在介绍前缀和的原理之前,那么我们先来说下前缀和最基本的一个应用场景,那么就是如我们标题所说的子数组累加和问题,那么假设我们现在有一个区间为[L,R]的数组,那么我们要求的其中子数组比如[L,i]或者[i,m] (L&l…

Notepad++ 中删除所有以 “pdf“ 结尾的行

Notepad 中删除所有以 “pdf” 结尾的行 操作步骤 1.打开文件: 在 Notepad 中打开你需要处理的文本文件。 2.打开查找和替换对话框: 按快捷键 Ctrl F,打开“查找和替换”对话框。 3.启用正则表达式模式: 在对话框的底部&#xf…

知识管理成功:关键指标和策略,研究信息的投资回报率

信息过载会影响生产力。没有人工智能的帮助,信息过载会影响生产力。大量的可用信息,知识工作者不仅仅是超负荷工作;他们感到不知所措,他们倾向于浪费时间(和脑细胞)来应付他们被大量的数据抛向他们&#xf…

Golang 进阶训练营

一、Golang 的 slice、map、channel 1.1 slice vs array a : make([]int, 100) //切片 b : [100]int{} //数组array需指明长度,长度为常量且不可改变 array长度为其类型中的组成部分(给参数为长度100的数组的方法传长度为101的会报错) array在…

Oracle临时表空间(基础操作)

临时表空间 临时表空间:用来存放用户的临时数据,临时数据在需要时被覆盖,关闭数据库后自动删除,其中不能存放永久性数据。 用户进程和服务器进程是一对一的叫做专用连接。 任何一个用户连到oracle数据库,oracle都会…

AI时代的前端开发:对抗压力的利器

在飞速发展的AI时代,前端开发工程师们面临着前所未有的挑战。项目周期不断缩短,需求变化日新月异,交付压力更是与日俱增,这使得开发人员承受着巨大的压力。如何提升对抗压能力,成为摆在每一位前端工程师面前的重要课题…

如何使用DHTMLX Scheduler的拖放功能,在 JS 日程安排日历中创建一组相同的事件

DHTMLX Scheduler 是一个全面的调度解决方案,涵盖了与规划事件相关的广泛需求。假设您在我们的 Scheduler 文档中找不到任何功能,并且希望在我们的 Scheduler 文档中看到您的项目。在这种情况下,很可能可以使用自定义解决方案来实现此类功能。…

计算机网络-八股-学习摘要

一:HTTP的基本概念 全称: 超文本传输协议 从三个方面介绍HTTP协议 1,超文本:我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等&am…

【pytorch】weight_norm和spectral_norm

apply_parametrization_norm 和spectral_norm是 PyTorch 中用于对模型参数进行规范化的方法,但它们在实现和使用上有显著的区别。以下是它们的主要区别和对比: 实现方式 weight_norm: weight_norm 是一种参数重参数化技术,将权…

回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.回归预测 | Matlab实现PSO-HKELM粒子群算法优化混合核…

多媒体软件安全与授权新范例,用 CodeMeter 实现安全、高效的软件许可管理

背景概述 Reason Studios 成立于 1994 年,总部位于瑞典斯德哥尔摩,是全球领先的音乐制作软件开发商。凭借创新的软件产品和行业标准技术,如 ReWire 和 REX 文件格式,Reason Studios 为全球专业音乐人和业余爱好者提供了一系列高质…

C++,STL容器适配器,stack:栈深入解析

文章目录 一、容器概览与核心特性核心特性速览二、底层实现原理1. 容器适配器设计2. 默认容器对比三、核心操作详解1. 容器初始化2. 元素操作接口3. 自定义栈实现四、实战应用场景1. 括号匹配校验2. 浏览器历史记录管理五、性能优化策略1. 底层容器选择基准2. 内存预分配技巧六…