【ECS游戏架构】逻辑帧驱动带来的性能和即时性问题分析

news2024/12/22 22:17:04

1024水一篇~
个人拙见,如有错误希望大佬拔刀纠正。

根据守望先锋在GDC会议上对ECS架构的描述,所有的系统(system)都是由逻辑帧驱动的:每帧遍历所有的system,并调用system的update()更新游戏世界的状态。
在这里插入图片描述

在实际应用中这可能会存在一些问题:两帧之间资源空闲、即时性低。本文分别从 把ECS应用到帧同步、状态同步,以及对应的客户端、服务器来进行分析。

在帧同步中的具体分析

  • 客户端:负责所有核心逻辑。

    • 有资源空闲没有问题,客户端只要能流畅运行即可,没有要"榨干客户端资源"的需求。
    • 可能存在的即时性问题:负责记录每帧输入的系统s1得到本帧的输入后,要由网络发送系统s2发送给服务器。如果s2在s1之前执行,则s1记录的每帧输入要在下一帧才能由s2发送给服务器,这就产生了1帧的延迟。帧同步本来就要求低延迟,因此应该避免这种问题。
      解决方案是对系统进行排序,使系统按顺序执行,保证先记录每帧输入,然后再向服务器发送消息,这样就可以在同一帧中完成。
  • 服务器:负责转发客户端的每帧输入。

    • 资源空闲问题:服务器应该尽可能的充分利用资源以提高承载量。可以灵活调节服务器逻辑帧率,即负载高时调慢帧率,负载低时调高帧率。还可以不同系统采取不同的帧率,如处理移动的系统可以固定30帧,而战斗系统的帧率可以更高,甚至可以不由逻辑帧驱动,直接死循环执行update()

      这些方案实际上这就是对ECS进行了一些改造,但结构上还是E-C-S,只是系统的update()的驱动方式更加灵活了。

      注意,只有服务器可以这样灵活调节逻辑帧率,客户端不行。因为帧同步要保证每个客户端的每帧逻辑一致,那么让每个客户端的逻辑帧率一致,并且逻辑帧率固定,是最简单可靠的方案。如果逻辑帧率是灵活变化的,会大幅增加系统的复杂度。

    • 可能存在的即时性问题是:类似于对客户端的分析,如果网络发送系统s2在网络接收系统s1之前执行,则会产生1帧的延迟。解决方案有:对系统进行排序,或者调高网络收发系统的逻辑帧率,或者直接让网络收发系统不由逻辑帧驱动。

在状态同步中的具体分析

  • 客户端:接收服务器发来的状态进行表现。
    • 资源空闲问题:同"帧同步客户端"分析一样。
    • 即时性问题:同"帧同步客户端"分析一样。
  • 服务器:负责所有核心逻辑。状态同步服务器要做的逻辑很多,因此更有必要避免资源空闲和即时性问题。
    • 资源空闲问题:同"帧同步服务器"分析一样。
    • 即时性问题:同"帧同步服务器"分析一样。

方案总结

  • 系统按序执行,满足大部分完整逻辑尽量在一帧内完成,保证即时性。我知道要把几十个system进行排序是一件很头大的事情,但如果真的能够做到,这其实也是最简单的一种方式。

    • 将网络分为网络接收系统和网络发送系统。接收系统在所有负责逻辑的系统之前执行,而发送系统在所有负责逻辑的系统之后执行。

    • …随时想到随时补充。

  • 改变服务器system.update()的驱动方式:三种方案,灵活调节逻辑帧率、不同系统使用不同帧率、不用逻辑帧驱动。既能保证即时性,又能充分发挥性能。虽然不完全符合ECS,但无伤大雅,结构上还是E-C-S,只是系统的update()的驱动方式更加灵活了。

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

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

相关文章

缓存分片中的哈希算法与一致性哈希算法

什么是缓存分片 在高并发场景下,缓存往往成为了瓶颈。这时候,我们可以通过缓存数据分片的方式来解决问题。所谓缓存数据分片,就是将缓存数据按照一定的规则分成多个片段,每个片段由不同的缓存节点负责。这样做有两个好处&#xf…

广告掘金全自动挂机项目,单设备30+【软件脚本+技术教程】

广告掘金项目是一种越来越受欢迎的赚钱方式,它通过观看广告视频来获取收益。然而,手动观看每个广告视频可能会耗费大量时间和精力。为了简化操作并提升效率,我们可以利用全自动挂机脚本来完成这一任务。接下来,将为您介绍如何使用…

proxmox pve /dev/mapper/pve-root扩容

vgs3 pvs4 vgs5 lvs6 lvremove /dev/pve/data8 lvresize -l 100%FREE /dev/pve/root9 resize2fs /dev/mapper/pve-root 10 history

爆肝整理,Pytest+Allure+Jenkins自动化测试集成实战(图文详细步骤)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、简介 pytesta…

宝塔FTP提示:553 Can‘t open that file: Permission denied的解决方案

[2023-10-18 15:16] 无法传输文件 ‘D:\phpstudy_pro\WWW\lockgis\static\js\coordtransform.js’。Cant open output connection for file “ftp://iot.test.net/lockgis/static/js/coordtransform.js”. Reason: “553 Can’t open that file: Permission denied”. 原因分析…

美国国防部网络战略如何改变国家网络防御

十年前,时任国防部长莱昂帕内塔说了一句后来臭名昭著的短语:“网络珍珠港”。帕内塔利用他作为该国主要国家安全官员的平台来警告美国未来将遭受可怕的数字攻击。 他警告说,能源基础设施、交通系统、金融平台等都容易受到剥削。媒体、专家和…

基于C语言 --- 自己写一个通讯录

C语言程序设计笔记---039 C语言之实现通讯录1、介绍C/C程序的内存开辟2、C语言实现通讯录2.1、ContactMain.c程序大纲2.2、Contact2.h2.3、Contact2.c2.3.1 InitContact( )初始化通讯录函数2.3.2 AddContact( )添加联系人和CheckCapaticy( )检查容量函数2.3.3、ShowContact( )显…

重大技术问题,iPhone 15 Pro Max面临“烧屏门”风波 | 百能云芯

近期,社交媒体平台上陆续涌现大量用户和数码博主就iPhone 15 Pro Max出现烧屏问题的投诉与评论。 烧屏问题是OLED屏幕常见的一个缺陷,这是由OLED屏幕发光机制引发的,OLED屏幕可视为由无数微小的灯泡-像素点构成,这些像素点可以独立…

redis场用命令及其Java操作

目录 1. Redis入门 1.1 Redis简介 1.2 Redis下载与安装 1.2.1 Redis下载 1.2.2 Redis安装 1.3 Redis服务启动与停止 1.3.1 服务启动命令 1.3.2 客户端连接命令 1.3.3 修改Redis配置文件 1.3.4 Redis客户端图形工具 2. Redis数据类型 2.1 五种常用数据类型介绍 2.2 …

【单片机基础】按键状态机实现短按、长按、双击、三击和N击

下载地址: 【CSDNNaiva】源码:HK32F030M-按键扫描-短按长按检测 参考资料 [1] 【CSDNPillarPeng】【按键】[独立按键] - 1: 单击,双击,三击以及N击 [2] 【CSDNPillarPeng】【按键】[独立按键] - 2:双击 …

git简介和指令

git是一个开源的的分布式版本控制系统,用于高效的管理各种大小项目和文件 用途:防止代码丢失,做备份 项目的版本管理和控制,可以通过设置节点进行跳转 建立各自的开发环境分支,互不影响,方便合并 在多终端开…

git pull 和 git fetch 有什么区别?

一、是什么 先回顾两个命令的定义 git fetch 命令用于从另一个存储库下载对象和引用git pull 命令用于从另一个存储库或本地分支获取并集成(整合) 再来看一次git的工作流程图,如下所示: 可以看到,git fetch是将远程主机的最新内容拉到本地…

md5算法实现

前言 md5算法是我们经常会用到的一个hash函数, 虽然已经被证明是不安全的了, 但其应用依然十分广泛. 哈希函数具有如下特点: 将任意长度的字符串映射为固定长度源数据微小的改动会导致结果差异巨大不可逆暴力破解困难 你有没有好奇过, 哈希函数是如何做到这些的呢? 本文就…

LSTM 与 GRU

RNN无法处理长距离依赖问题,通俗点就是不能处理一些较长的序列数据,那么今天就来介绍一下两个能处理长距离依赖问题地RNN变种结构,LSTM和GRU。 1. LSTM(Long short-term memory) 1.1 LSTM结构 上左图是普通RNN结构图…

深入浅出排序算法之归并排序

目录 1. 归并排序的原理 1.1 二路归并排序执行流程 2. 代码分析 2.1 代码设计 3. 性能分析 4. 非递归版本 1. 归并排序的原理 “归并”一词的中文含义就是合并、并入的意思,而在数据结构中的定义是将两个或者两个以上的有序表组合成一个新的有序表。 归并排序…

前端性能优化 - 虚拟滚动

一 需求背景 需求:在一个表格里面一次性渲染全部数据,不采用分页形式,每行数据都有Echart图插入。 问题:图表渲染卡顿 技术栈:Element UI 卡顿原因:页面渲染时大量的元素参与到了重排的动作中,…

2023 uniapp( vue3)使用canvas生成海报并保存,taro/微信小程序也适用

有段时间没写vue了&#xff0c;有点生疏了...... 1、代码有注释&#xff0c;完整代码如下 <template><view class"page"><canvas class"canvas" v-if"isShow" :style"{width:${canvasWidth}px,height:${canvasHeight}px}&…

格式化之 %d,%2d, %02d

在Java中&#xff0c;%d&#xff0c;%2d 和 %02d 都用于格式化整数&#xff1a; %d&#xff1a; %d 是格式化整数的基本占位符。当使用 %d 格式化整数时&#xff0c;它将使用默认的对齐方式&#xff0c;通常是右对齐&#xff0c;并没有指定宽度。例如&#xff0c;System.out.…

解决 webpack 4.X:autoprefixer 插件使用不起作用的两种解决方案

1、问题描述&#xff1a; 其一、存在的问题为&#xff1a; 加载 autoprefixer 插件的过程中&#xff0c;页面却显示并没有自动添加浏览器的厂商前缀; 其二、问题描述为&#xff1a; 在写 CSS3 这些新的特性时&#xff0c;存在着不同的浏览器解析这些新特性时&#xff0c;需…

学习package.json

package.json 文件&#xff0c;它是项目的配置文件&#xff0c;常见的配置有配置项目启动、打包命令&#xff0c;声明依赖包等。package.json 文件是一个 JSON 对象&#xff0c;该对象的每一个成员就是当前项目的一项设置。 {"name": "monorepo_frame",&q…