组合优于继承

ecs的概念很早就有了,最初的主要目的应该还是为了改善设计。

e-c-s三者都有其意义,e-c是组合优于继承,主要用以改善oo的继承耦合过重以及多继承菱形问题。

oop常见设计里,每个gameobject有父类,子类继承来实现不同类型的对象,很容易产生过多\过深的继承以及多继承,而这两者理论上都不好(依赖、冗余),

继承更应该用来隔离接口与实现(父类提供接口,子类提供实现,调用方只关心父类接口,不关心具体子类实现),而不是用来重用父类的代码。

Entity抽象成容器

e-c里gameobject是entity,只是个类似容器的抽象概念,entity里包含的component决定了对象是什么

component可以给不同的gameobject重用,通过组合多种component而不是继承来构造不同的对象。

Unity中的ECS

unity一直以来都是component based,可以看成e-c,此外还有很多现代引擎也是e-c(ue、cryengine等).

对同一类型的component,通常会进行相同的操作(比如用render组件进行渲染),一个直观的想法就是把这些操作集中在一起,就是system。

一个理想的设计里,包含多种不同的system,每个system只处理一个类型的component,每帧对所有compoent实例进行相同的操作,继而可以做到数据和逻辑分离,component里放纯数据,逻辑在system里。

ECS的好处有几个

  1. 逻辑集中在system里,职责单一,读\改\控制(初始化、顺序依赖等等)都方便。

  2. 容易扩展,很容易新增e\c\s. 新增任何entity,这些entity上有各种component,这些component可以(自动)共享现有的system,不需要单独写。

  3. 灵活,e-c-s之间,s-s之间,e-e之间,c-c之间耦合较松,便于读\改\扩展。理想情况下不同的system之间,不同的compoent之间没有任何依赖,但通常很难做到。

  4. cache friendly, system会连续对同一类component进行操作,保证了时间上的局部性(连续性),如果这些component能保证空间上的局部性(内存布局连续),则显而易见对缓存是很友好的。

  5. simd, 如果能保证同一个system对大量compoent实例的操作顺序无关,那么很自然的可以并发。 但实际中,component很难完全独立,经常需要和其它component进行交互,也就是system很难做到只负责一类component,通常需要和多种component(甚至其它系统)进行交互,交互的开销,遍历compoent的开销都需要考虑。

摘自:a(704757217)

理解ECS的概念和Unity中的ECS设计的更多相关文章

  1. Unity下的ECS框架 Entitas简介

    最近随着守望先锋制作组在gdc上发布的一个关于ecs的talk,ecs这个架构算是得到了一定的曝光度. 在这之前,github上就一直有一个C#的ecs框架名为Entitas,截止现在已经有1300+ ...

  2. Unity中使用WebView

    Unity中使用WebView @(设计) 需求,最近游戏中需要引入H5直播页面和更新比较频繁的赛事页面,需求包括:加密传参数.和Unity交互,在Unity框架下其实有几种方案: 内置函数Appli ...

  3. 介绍Unity中相机的投影矩阵与剪切图像、投影概念

    这篇作为上一篇的补充介绍,主要讲Unity里面的投影矩阵的问题: 上篇的链接写给VR手游开发小白的教程:(三)UnityVR插件CardboardSDKForUnity解析(二) 关于Unity中的C ...

  4. Unity中2D和UGUI图集的理解与使用

    图集 什么是图集? 在使用3D技术开发2D游戏或制作UI时(即使用GPU绘制),都会使用到图集,而使用CPU渲染的2D游戏和UI则不存在图集这个概念(比如Flash的原生显示列表),那么什么是图集呢? ...

  5. Unity编程标准导引-Unity中的基本概念-2.1界面概览

    Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...

  6. 关于unity中BindChannels的理解

    http://blog.csdn.net/wpapa/article/details/51794277 官方文档:http://docs.unity3d.com/Manual/SL-BindChann ...

  7. 在Unity中使用UGUI修改Mesh绘制几何图形

    在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...

  8. 解读Unity中的CG编写Shader系列八(镜面反射)

    转自http://www.itnose.net/detail/6117378.html 讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知 ...

  9. 【Unity编程】Unity中关于四元数的API详解

    本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计 ...

随机推荐

  1. windows服务器解决挖矿程序问题

    前几天发现服务器报警,cpu使用率已达100%,查资料知道正是最近比较流行的挖矿程序在捣鬼.我们使用的是阿里云的服务器,操作系统是windows server.网上有大量的资料讲如何处理,我把自己处理 ...

  2. MT2017笔试题

    一.大富翁游戏 1.题目 大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步.求玩家走到第n步(n<=骰子最大点数且是方法的唯一入 ...

  3. 如何让div内的多行文本上下左右居中

    1.首先,如果div中的文本特别少,不超过div宽度,那么这种就非常简单了,直接line-height等于height就可以了 <style type="text/css"& ...

  4. D3、openlayers的一次尝试

    近期尝试了一个webgl相关的内容,有些小激动,及时分享一下我的测试示例,效果如下: 此示例分从业务角度分为两部分,一个部分为d3展示的柱图,另一部分则为用openlayers展示的地图.而其难点却在 ...

  5. 【Vue】IView之table组件化学习(二)

    最基本的绑定table是这样的,需要columns和data两个属性. <template> <Card> <h4>表格栗子</h4> <Tabl ...

  6. 编写基于Property-based的单元测试

    编写基于Property-based的单元测试 作为一个开发者,你可能认为你的职责就是编写代码从而完成需求.我不敢苟同,开发者的工作是通过软件来解决现实需求,编写代码只是软件开发的其中一个方面,编写可 ...

  7. XSS Reflected 测试

    由于最近在做XSS方面的测试,于是找到了DVWA平台进行实验测试,通过这三篇文章让大家了解XSS方面的大概内容,这三篇文章只是把你领进XSS的大门,要想真正深入的学习XSS,你还需要去学习很多东西来提 ...

  8. 3分钟学会如何调度运营海量Redis系统

    本文由云+社区发表 作者:冯伟源 作者:冯伟源,高级工程师,腾讯云Redis系统运维负责人.6年DBA经验,一直从事SQL优化.实例调优.数据库架构.海量数据库集群运维.运营平台建设和管理等工作.为 ...

  9. Docker最全教程——从理论到实战(三)

    往期链接: https://www.cnblogs.com/codelove/p/10030439.html https://www.cnblogs.com/codelove/p/10036608.h ...

  10. [Go] golang缓冲通道实现管理一组goroutine工作

    通道1.当一个资源需要在goroutine之间共享时,通道在goroutine之间架起了一个管道2.无缓冲通道和有缓冲通道,make的第二个参数就是缓冲区大小3.无缓冲通道需要发送和接收都准备好,否则 ...