首页 > 其他分享 >ECS(Entity-Component-System)模式

ECS(Entity-Component-System)模式

时间:2024-04-25 17:14:52浏览次数:24  
标签:Component System 模式 Entity ECS 组件

前言:

在使用Cocos Creator开发弹幕游戏的过程中,由于项目中出现的单位过多,导致项目的性能并不是特别理想,当时研究这个问题的时候看到用ECS可以解决这方面的问题,所以研究后将其应用进项目中,实践后发现ECS这种模式要去unity下插件配合使用效果才大,在cocos上效果甚微;不过上线后勉强还扛得住。目前使用对比:unity能抗住10000单位30帧,cocos10000单位只有20帧,啥也不用10000单位只有15帧。注:目前学习还不算完善,后续继续补充,有错误的,各位大佬受累帮小弟指正,万分感激!!!

简介:

ECS(Entity-Component-System)模式通常被归类为一种组件化设计模式,它主要用于构建游戏引擎和其他需要高度灵活性和性能的软件系统。尽管ECS模式在一些领域中非常流行,但它并不像传统的设计模式那样具有普遍性和标准化。在一些设计模式的分类中,ECS可能被归类为结构型模式或行为型模式的一种变体,具体取决于它是如何被应用和实现的。ECS模式的基本思想是将实体(Entity)分解为组件(Component),并通过系统(System)来处理这些组件。每个实体由一组组件构成,系统根据组件的类型和数据来执行特定的逻辑。这种模式的优势在于它的高度灵活性、可扩展性和性能优化,特别适用于需要处理大量实体和复杂逻辑的场景,比如游戏开发中的物体管理和行为控制。尽管ECS模式在特定领域中非常有用,但由于它的特殊性和定制性,通常不被纳入传统的设计模式范畴之中。

个人理解

E就是entity ,一个不代表任何意义的实体;

C就是各自脚本,Component 一个只包含数据的组件:(这里采用了黑板的形式来存储对应的数据,采用状态机来实现AI模块)

S就是整个游戏框架,包含所有Manager组成的游戏框架

其主要特点在于是面向数据编程,利用组合优于继承的思想,关注数据类型,关注系统的运行和状态,不关注具体某个对象的细节。数据与逻辑处理完全解耦。

优劣性:

参考文章

相比于传统的OOP,ECS在写法上要复杂很多,一个对象可以集中的数据来用多个Component来管理,还要额外的System来处理逻辑。但是,ECS它做到让设计分离了,由此的影响如下:

优势:

  • 减少多人开发时遇到的问题

如果有一个非常复杂的对象,许多人的工作都和这个对象有牵连,当A在进行逻辑处理时,他不得不传整个对象,还要考虑修改对其他人的影响;

  • 基于组合优于继承原则

组合优于继承,这是设计层面上的原则,而ECS的Entity则是Component的组合,提高了复用性,也方便我们只关注处理对下对象的某个局部;且当我们对某个功能进行拓展时,几乎不会影响到其它功能模块,因为每个部分都是几乎不关联的;

  • 容易预测和回滚

ECS的初衷就是为解决预测和回滚的,因为数据和状态都存储在Component里面,因此记录关键帧的数据和状态非常方便,这就使得实现预测和回滚容易许多;

  • 适合游戏开发层面做逻辑表现分离

同一套逻辑处理系统,加了表现组件就有了表现,可以放在客户端,不加的话就是纯逻辑,放在服务端确认客户端回传的数据。一套代码又能做服务器又能做客户端;

  • 提升性能(在Cocos中的作用不是特别大)

ECS这种面向数据的方式,使得内存排列天然紧密,非常适合现代CPU的缓存机制,极大增加了CPU的缓存命中率,大幅提升了性能

劣势:

ECS在处理大批量数据上有明显的优势,但是在处理小数据上如UI层面,网络层面上等就不太适合使用。而且Component本身不知道哪些System关注它,System也不知道什么时候关注的Component发生改变,即无法做到自驱动,必须有外部的东西来驱动这些System去工作,其实还需要许多Utility来辅助工作。

标签:Component,System,模式,Entity,ECS,组件
From: https://www.cnblogs.com/qindaoao/p/18158127

相关文章

  • JSON 序列化 属性名 大写变成小写 保持不变 newsoft.json system.text.json
    JSON序列化属性名由大写变成小写的问题在ASP.NET中,默认情况下,JSON序列化会将属性名转换为小写(camelcase)以匹配JSON的约定。如果您希望保留C#的命名约定(即属性名的大小写不变),您需要更改默认的JSON序列化器。System.Text.Json使用System.Text.Json(推荐):在Startup.c......
  • Web Component addEventListener .bind(this)的函数带参数引起的报错
     一开始这样写:  this.shadowRoot.querySelector('.prev').addEventListener('click',this.moveSlide(1).bind(this));报错:UncaughtTypeError:Cannotreadpropertiesofundefined(reading'bind')    以为是前面的DOM获取不对,但是怎么改都不对,网上查询后......
  • MIT6.S081 - Lab2: system calls
    Lab2:systemcalls预备知识执行一次系统调用的流程:USERMODEstep1:系统调用声明user/user.h:系统调用函数(如intfork(void))step2:ecall进入内核态user/usys.S(该文件由user/usys.pl生成,后续添加函数可以在这里添加):执行如下命令.globalforkfork:lia7,SYS_f......
  • Kernel panic - not syncing: Out of memory: system-wide panic_on_oom is enabled
    内存不足,导致Java 进程被杀掉。 [1534.300650]Kernelpanic-notsyncing:Outofmemory:system-widepanic_on_oomisenabled[1534.301803]CPU:5PID:2930Comm:javaKdump:loadedTainted:GO5.10.0-60.18.0.50.r1083_58.hce2.x86_64#1[153......
  • System.AggregateException: 发生一个或多个错误.....
    System.AggregateException:发生一个或多个错误。--->Microsoft.WebTools.Shared.Exceptions.WebToolsException:生成失败。检查输出窗口了解更多详细信息。---内部异常堆栈跟踪的结尾------>(内部异常#0)Microsoft.WebTools.Shared.Exceptions.WebToolsException:生......
  • P7981 [JRKSJ R3] system
    P7981[JRKSJR3]system建图看到这题,容易想到\(i\rightarrowa_i\),那么这个过程实际上形成了基环树森林。接下来分析操作在图上的变化。我们以环上的每个节点作为根,手玩之后就可以发现,经过\(k\)次操作后,每个节点的值就是\(2^k\)级父亲(包括自己)。虽然这样不够严谨,因为跳完......
  • MIT6.S081 - Lecture3: OS Organization and System Calls
    为什么要使用操作系统使用操作系统的主要原因是为了实现CPU多进程分时复用以及内存隔离如果没有操作系统,应用程序会直接与硬件进行交互,这时应用程序会直接使用CPU,比如假设只有一个CPU核,一个应用程序在这个CPU核上运行,但是同时其他程序也需要运行,因为没有操作系统来帮助......
  • 错误:System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题
    最近在虚拟机上搭一套新的开发环境,运行项目时报错。如果你的系统中已经安装了Oracle客户端软件,那么可能需要检查一些环境变量。例如,你可以通过在系统的环境变量中设置PATH变量来包含Oracle客户端的路径,这样可以帮助.NET框架找到所需的Oracle客户端软件。此外,如果你的Oracle客户......
  • 用 React 结合 SAP UI5 Web Components 来开发 SAP Fiori 应用
    用React结合SAPUI5WebComponents来开发SAPFiori应用阿里云开发者​已认证账号​关注 6人赞同了该文章简介:用React结合SAPUI5WebComponents来开发SAPFiori应用在FioriFundamentals和SAPUI5WebComponent诞生之前,SA......
  • Visual Components软件为您带来的价值 衡祖仿真
    VisualComponents具备丰富的3D仿真功能、快速建模能力、定制化应用程序逻辑和大量预定义组件库等多种特点,为自动化设备制造商、整合商、制造型公司提供简单、快速和的设计方式,可以有效提高生产效率,并优化资源分配,避免制造过程中各种不可控事件带来的影响。VisualComponents软......