从一开始的面向过程编程,再到后来面向对象编程。随着硬件性能的不断改进,用户对软件应用的要求也水涨船高。愈发庞大的应用不再是一个人或几个人的小团队能够完成的呢,分工愈来愈明显,逼迫着编程思想不断进步。

ECS设计理念并不是一个新兴的事物,早就在90年代存在了。但是最近,由于2017年《守望先锋》游戏团队在大会上的分享,再次走入了大众的视野。

一. 初步理解

ECS,Entity(实体) Component(组件) System(系统),是一个gameplay层面的框架,它是建立在渲染引擎,物理引擎之上的,主要解决的问题是如何建立一个模型来处理游戏对象的更新操作,是对数据集合的操作。

Entity,有点类似于Unity中的Game Object,在ECS中,它仅仅是一个Component的组合,不具有任何代表意义,它的意义就在于对其上的Component进行生命周期管理。

而Component和System则是这个框架的核心,Component是一个只包含数据的组件,将每个可能单独使用的对象属性归纳,里面只有数据没有任何方法,如角色的生命值蓝量就是一个Component,每个Entity是由多个Component组合而成,共享一个生命周期。

而System则是用来处理数据的系统,里面只有方法,没有任何数据,每个System只关注于干好一件事情,它只关心那件事作用于游戏世界里同类的一组对象的每单个个体,或是这类对象的某种特定的交互行为。

而游戏的业务循环就是在调用很多不同的系统,每个系统自己遍历自己关心的对象,只有使用预定义组件部分可以被子系统感知到,这样的系统具有很强的内聚性。

二. ECS作用

ECS的设计就是为了管理复杂度,其指导方法就是:Component是纯数据组合,没有任何操作数据的方法;而System是纯方法组合,它没有自己的内部状态,它要么做成无副作用的纯函数,根据它所见到的对象Component组合计算出某种结果;要么用来更新特定Component状态。

在System之间也不用相互调用(减少相互耦合),是由游戏外部框架来驱动若干System的。这样一来每个System都可以独立开发,它只需要遍历框架提供给他的组件集合,做出正确的处理,更新组件状态就够了。而编写Gamplay的人只需要清楚每个System到底做了什么,操作本身对哪些Component产生影响,正确书写System的更新次序就可以了。这样一来容易管理复杂度,二来哥并行处理留下了优化空间(是不是感觉和Unity3D有种莫名的相似感?实际上Unity中大量地方采用了ECS设计思想)。

三. ECS的数据处理

由于System只是对定义好的Component状态的加工过程,那么就会有多个System中处理同一个问题,涉及到相同的Component的情况。当这个问题只相关到一个Entity时,还可以设计出一个System逐个把结果计算出来存为Component的状态;但是当这个问题涉及到多个Entity时候,或者这个行为并不想额外修改Component的状态,保持无副作用。

这个时候就需要引入Utlity函数概念,Utility函数是共享给不同的System调用。为了降低系统复杂度,就要求函数是无副作用的,或是仅仅在很少的地方调用;如果副作用实在存在,又会在很多System中触发,那么就先将行为发生时需要的状态保存起来,放在一个队列里,由一个单独的System在独立环节来处理,推迟到当前帧末尾或下一帧开头来做。

四. ECS的优劣

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

1. 减少多人开发时出问题的概率

如果有一个非常复杂的对象,许多人的工作都和这个对象有牵连,当A在进行逻辑处理时,他不得不传整个对象,还要考虑修改对其他人的影响;但是拆离后,A可以把自己的数据封在特殊的Component里,用自己的System处理,减少出问题概率(但是这样会增加代码复杂度);

2. 基于组合优于继承原则

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

3. 容易预测和回滚

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

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

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

5. 提升性能

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

6. ECS的劣势

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

参考文章:

  1. 云风大神的blog;
  2. 手游开发三两事-知乎专栏

  1. OOP, Object Oriented Programming,面向对象的编程;OOD,面向对象的设计;OOA,面向对象的分析; ↩︎

  2. 组合优于继承,将不变的部分使用继承以方便复用,将多变的部分用组合以方便拓展; ↩︎

  3. 当CPU到缓存中去寻找数据时,发生找不到的情况,就是未命中;简单了解缓存命中率,了解更多关于内存和缓存的知识; ↩︎

框架设计:浅谈ECS设计思想(一)相关推荐

  1. OOD面向对象设计浅谈

    來源:http://dev.csdn.net/htmls/59/59377.html OOD面向对象设计浅谈 前言 OOD指面向对象设计,在软件设计生命周期中发生于OOA之后期或者之后,OOA与OOD ...

  2. 浅谈数据库设计技巧(上)

    浅谈数据库设计技巧(上) 说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡 ...

  3. 中鸣循迹机器人_浅谈机器人设计方法

    浅谈机器人设计方法 摘要: 机器人是人类完成智能化中非常重要的工具, 随着时代的发展, 机器 人已经在世界有了一定的发展,甚至很多国家机器人已经运用到实际的生活中 去. 而机器人的设计方法无疑是很多人 ...

  4. Lily-w131 wifi模块天线分集硬件设计浅谈

    wifi模块天线分集 Lily-w131 wifi模块天线分集硬件设计浅谈 引用百度百科天线分集的概念.天线分集是使用两个接收信道,它们受到的衰落影响是不相关的:两者在某一时刻同时经受某一深衰落点影响 ...

  5. 浅谈工厂设计--java必备技能

    浅谈工厂设计–java必备技能 说到工厂,我就联想到了亚洲的大工厂富士康–接过订单然后按照固定的模板生产商品,其实java中工厂类中的工厂方法也是一样,接过参数,根据参数来生产需要的商品: 今天我们一 ...

  6. 浅谈购物中心设计之外立面设计注意点

    购物中心的主体定位中,可以通过外立面设计充分的发挥和展现个性,吸引八方游客,从而使购物中心的商圈辐射超越了地区的界限.具体来说,购物中心外立面设计需要注意哪些方面呢?我们今天就来浅谈购物中心设计之外立 ...

  7. 计算机中用户的分类有哪些,用户分类浅谈交互设计 -电脑资料

    说到网络产品,离不开的话题就是用户,就像传统行业的消费者, 不分类不好定位, 好的用户分类让我知道了我在追求哪些人,满足哪些人,影响哪些人.但分不好类又会错位,更糟,那怎样才能对某一款产品的用户群进行 ...

  8. c语言程序与设计教学设计,浅谈C语言程序设计课程的教学设计

    C语言程序设计课程是一门计算机专业程序设计语言类的基础课程,如何将枯燥复杂的语法.单调抽象的函数让学生们有兴趣学习.研究.文章通过在C语言程序设计这门课教学的设计,浅谈了自己的见解和方法. 大多数计算 ...

  9. 我的家乡网页设计_Graphic Design|康石石浅谈LOGO设计在作品集中的创作方法

    写在前面的话 平面设计范畴极广,其领域不仅限于常见的版式设计.海报设计.LOGO设计.VI设计.书籍装帧.广告设计.网页设计.在艺术留学申请过程中,学习平面设计的同学们需依据目标院校对作品集项目及页数 ...

最新文章

  1. 菜鸟经验积累之JS运算
  2. 微服务化之缓存的设计
  3. PyTorch中使用指定的GPU
  4. centos7 mysql创建表_centos7下创建数据库和用户
  5. 部署 Job (第二部分)
  6. 记录——《C Primer Plus (第五版)》第八章编程练习第三题
  7. 最大一笔收购,Pokémon Go开发商Niantic收购AR开发平台8th Wall
  8. mysql角色管理权限管理_mysql权限角色管理
  9. C++多线程之_beginthread与_beginthreadex
  10. 同构数怎么判断_判断同构数C语言
  11. Python计算机视觉之特征提取与图像匹配
  12. 15讲项目实战内页展示区收尾
  13. 五大电子邮件的营销方法,教你提高客户的回头率!
  14. pyqt 控件焦点_PyQt5 控件学习(一个一个学习之QTextEdit)
  15. 淘淘商城系列(一)—— 电商行业的背景介绍(一)
  16. 内网主机通过公网域名解析访问内网服务器,存在什么问题,如何解决?
  17. D妹上新|DoH和DoT开始公测啦!
  18. Js/es for(let i in Obj)效率分析及优化
  19. 最新尚硅谷Java MyBatisPlus教程(完整)
  20. 访问www.baidu.com完整过程

热门文章

  1. 《Practical Machine Learning A New Look at Anomaly Detection》摘抄+笔记
  2. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 E-回旋星空
  3. linux intel 关闭睿频
  4. Mysql社区版安装教程
  5. (转)MFC是不是过时了!!!
  6. cocoa pods
  7. win7访问共享文件出现登录失败:禁用当前用户
  8. 项目二 PLC与RobotStudio联合仿真激光切割工作站——仿真模型搭建
  9. 获取Alexa排名数据接口
  10. 2022-2027年中国合成纤维行业市场全景评估及发展战略规划报告