前言

最近工作忙了很多关于设计的事情,用了常用的分层设计MVC也尝试是用了ECS这种设计方式,同时也参考了Unity或者Creator的这种组件化方式。有了很多困惑也有了一些总结。

首先,MVC也好ECS也好他们都是一种编程的范式,或者说你组织代码的方式。然而他们的层面不同,也就是说不是一个层面的东西。

  • MVC:用来解决UI交互方面的成熟的经验体系,是一种分层的设计。
  • ECS:是一种对象组织的方式,比如继承也是一种处理对象关系的方式。而ECS就是组合的方式来处理对象见关系的,还看到了一种说法:

Entity system architecture derives from an attempt to resolve the
problems with the game loop. It addresses the game loop as the core of
the game, and pre-supposes that simplifying the game loop is more
important than anything else in modern game architecture. More
important than separation of the view from the controller

也就是说ECS这种方式目标是用来尝试处理游戏循环问题的。并预先假设简化游戏循环比现代游戏架构中的任何其他东西更重要。比从控制器分离视图更重要。


同样,还有很多的架构,比如分层设计的系统架构等等。
简单的总结来说,他们不是一个层面的,MVC是一种分层的针对UI交互的设计,而ECS是一种处理对象关系的方式。

为什么我上面会困惑,就是我把不同层面的东西放到一个平面上来思考讨论了。就像你有一个衣服柜子,用它来放鞋子okay么?是的可以放,但是会不会别扭?会的。这就是我的一些困惑,可能这个例子并不恰当,但是用来说明不是一个层面的东西应该足够了。

关于数据驱动与解耦的方面

ECS其实更是解耦的终极方案,处理更复杂问题的一种更好的方案。另一方面MVC并不是不关注数据驱动,想要使用好MVC数据的驱动也是必须的才能更好的解耦。只不过MVC更关于也更适用于UI方面的交互罢了,当然这也是一种经验模型,后来的MVP以及MVVM都是一种优化或者特别场合的提升。

总结

MVC以及ECS不是一个层面的东西所以理论上不会有冲突。
至于适用场合,个人感觉:如果涉及ui交互比如某一个界面显示某些东西,同时这个ui可以出发一些事件这种还是MVC更方便一点,因为你用ECS会发现你无从下手,比如你是单独写个view的组件?这个view触发的事件呢?以及这个view所依赖的数据呢?都写到了一起?你会发现写着写着都写到了一起结构很乱。可能目前我并没有找到什么合理的方式。关于ECS的使用,其实目前如果基于creator来开发,并不是纯粹的ECS思想而是类似unity老版本的一种C-S的结合体的组件。什么时候以及什么场合使用,个人感觉是GamePlay的场景,

引用wiki的一句话:Gameplay is the pattern defined through the game rules.
也就是游戏玩法。

因为游戏的玩法复杂度很高,变化很多,这种时候利用组件的方式去实现游戏玩法,能保证各种玩法的组合,这样使用更加方便贴切。


PS:补充

临时有了想法作个补充,我说ECS是一种处理对象之间关系的方式。那MVC呢?这个不是么?我们都是面相对象编程,View是个对象么?Controller是个对象么?这个不是处理对象见关系的么?其实我想回答,是的。我们几乎都在处理各个对象。为了实现某个业务,把各个对象组织起来。好的代码就是轻度耦合实现。
但是,我想说,还是重点不同,其实MVC,我们本可以用一个view代码来实现所有,在view的代码里做很多处理控制。我们也能实现一个对象完成业务,可是为了应对频繁变化的需求慢慢演变出了MVC,它是一个解决方案。这就是侧重点以及面向的层面不同。
而ECS处理起真真切切的各个对象的时候,就会很自然而然。组合各个对象成某一个或者某一类对象,或者更合理的应该是,组织各种各样的数据?比如position组件,组织x,y坐标数据。这种面向数据的东西,或者说更注重这个数据的东西用ECS这种组件的方式更贴合。这个可能就设计到了为什么用组合而不用继承的这一系列讨论。比如这篇文章:What is an Entity Component System7


贴一下一些朋友对于ECS和MVC方面的见解

把ECS按在下层,使用轻MVC模式。首先考虑的问题是如何分层的问题,如果一个属性能够提炼成通过的ECS模型(比如你说的player相关属性),那么我会把这个属性沉淀,做成一个通用的C-S系统。这个系统和其它的系统以后都是以子系统的模式出现,在它的上面才是MVC,这里处理具体的UI交互问题。具体来说我们的应用分为基本的两层,上层用MVC来处理交互,下层用ECS或者其系统来处理各种各样的问题。关于轻MVC模式之所以这么说是因为游戏上的生命周期短,我很少真的去设计完善的MVC模型,基本上是意思到了,达到我心中的代码整洁、解耦清晰同时改起来又方便的时候就可以了。


过了好久了,偶然看到unity的 tiny project 一个为2d游戏提供的package,其实这个并没什么,但是重要的是它完全使用了ECS的这种模式,然后又给了我一些理解和启发这里补充下。

看过相面的一些想法和记录就明白其实我原来写的ECS的并不是ECS感觉上更像是组件化而已。

我们先来看看为什么有这个tiny project

很明显,对当前untiy的monobehavior和ECS做了一下对比。
引用类型值类型
数据散到内存的各个地方内存紧紧排列
在操作期间处理不需要的数据(其实我们需要model的一个数据反而传入了整个model)我们只处理需要的数据
高下立判,从第二点和第三点上我们就可以看出ECS的提升了对于性能上,内存紧凑跟容易让cpu进行寻址预判,处理只需要的数据更容易解耦复用。

然后再专业的看一下 ECS的各个结构的意义

Data Data Data 重要的事情说三遍
其实也很好理解,我们从class引用类型换成struct值类型,就像我们写c程序一样,所有的一切都是内存都是数据。

  • component就是单纯的数据而已,什么speed | health | name …等等
  • entity 就是一个单纯的一组component而已 并不是什么Object啊 什么你以为的Node啊之类,就是单纯的一组component而已,这里另一个设计概念就是我们的entity不允许同类型的component所以这里用了set
  • system就是操作数据而已,就是单纯的操作数据

这里让我受到启发和解惑的一个例子我觉得一定要举出来看一下

这是两个component的例子,一个heath一个sprite2D 很简单,都是struct,都是我们要用的数据,数据,数据再次强调。其实很长时间困扰我的一个问题是:
我经常会吧entity当做容器,弄什么都把component集合到这个entity上来,然后在表现一些东西上就会卡住,而这里给我们演示了,Sprite2D的其中一个数据就是Entity 是个image。这个乍看上去怎么怪怪的,就像我的思维,我们只吧entity当做容器,只有entity里才能放component,就是这样才限制了我们。所以这了再次强调,不要把entity当做容器,很容易让你困惑,就当做一组数据而已就好,就当做一组数据而已就好,就当做一组数据而已就好。那么我们一组数据里放另一组数据行吗?答案当然是和okay啊!就像我们写c程序struct里嵌入一个struct有啥问题么?组合一个有啥问题么?当然没有了。 当然了,这里image这个entitiy里有啥就得去看它这个struct里都组合了哪些数据了。所以 一切皆Data,一定要理解这一点。

关于ECS设计以及MVC分层设计和组件化设计的思考和总结(这个标题就问你长不长)相关推荐

  1. 一种灵活可靠的工作方式:组件化设计与开发

    一种灵活可靠的工作方式:组件化设计与开发 2017/03/20阅读 6.9k 评论 3收藏 174 零基础学产品,BAT产品总监带,2天线下集训+1年在线课程,全面掌握优秀产品经理必备技能.了解详情 ...

  2. 组件化设计思维 – 从规范到工具的构建与探索

    作者 | 斓青 原文 | http://www.aliued.cn/2017/08/31/组件化设计思维-从规范到工具的构建与探索.html 阿里巴巴在中台战略的背景下,设计提效又再次推动着设计思维的 ...

  3. 分布领域驱动设计(DDD):领域接口化设计式缓存的选择

    -     前言    - 把服务对象(service)和资源库对象(repository)设计成接口是最常见的.但是这对接口化的认识还远远不够,我们需要更深入地去分析接口化设计和更全面地应用接口化编 ...

  4. 领域驱动设计(DDD):领域接口化设计

    领域接口化设计 把服务对象(service)和资源库对象(repository)设计成接口是最常见的.但是这对接口化的认识还远远不够,我们需要更深入地去分析接口化设计和更全面地应用接口化编程.所以我们 ...

  5. 淘宝设计万能PSD分层模板(简约页面设计——少即是多)

    少即是多(less is more)的设计原则,这个原则的提出奠定了现代设计的基础.少即是多,简约而不简单是现代简约设计的核心,可以形容为用最精简的表现手段达到最好的效果,去掉多余的元素,颜色,形状和 ...

  6. 设计素材PSD分层模板|美食类海报设计技法

    文字划分层级关系 > 我们首先根据文案信息的重要性进行层级划分,将主次信息依次编排. 细节优化 > 将需要突出的信息进行刻画.提取出关键点,在一起形成对比. 无论是字型.图片的选择还是色彩 ...

  7. Vue深入-15【Vue组件化设计与派发器思想】

    (1).派发器初始,Vue中抽离派发器方法 type =>  事件 => 逻辑 => type => 派发器 => 数据的更改 actions const PLUS = ...

  8. C#.NET 可以为不同的客户定制不同的登录窗体的设计思路参考【功能代码组件化,可以灵活选配】...

    遇到不同的客户,往往会有不同的需求,例如一个用户总共才10来个人用这个系统,大多喜欢直接选用户名就可以了,都懒得输入了,若一个系统有成百上千的客户,那就希望有一个输入用户名.密码的登录功能,若充100 ...

  9. 扁平化设计与质感设计: 他们有什么不同?

    本文转载自 960px,译文链接:Click me 两种相似的设计风格,一个基于另一个.一个是新热事物,另一个,有人猜测,已经以自己的方式成为一种时尚.一个是自发的-适应设计的趋势,另一个却是有目标- ...

最新文章

  1. ACMNO.34 C语言-格式输出 请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用6.2f格式输出。
  2. PaaS服务之路漫谈(一)
  3. Amazon Alexa 新里程碑: 50000 个功能、 20000 种设备、 3500 个品牌
  4. 数据结构——模式匹配kmp算法
  5. jdbc url写法(集群)
  6. es6 Promise.race()方法
  7. fullcalendar next 不变化_让不懂编程的人爱上iPhone开发(2017秋iOS11+Swift4+Xcode9版)-第3篇...
  8. 推荐一个免费绘制软件架构图的网站
  9. [转]可爱的 Python:: 使用 itertools 模块中的组合函数
  10. sh-3.2非正常修正
  11. Android Studio中XML注释错误问题
  12. 计算机联锁维修管理机,计算机联锁试卷
  13. 大数据下 移动计算 和 移动数据的一点理解
  14. 嵌入式开发有年龄限制吗_32岁入门晚不晚?来听听这位70后程序员的故事
  15. python-函数参数和文档
  16. 对比度亮度图像增强及convertTo详解
  17. matlab怎么求三次微分,Matlab – 求解三阶微分方程
  18. Java小型项目:购物车小程序
  19. 资讯_邮件基本常识普及(to/cc/bcc) ;
  20. 大数据时代中的差旅管理

热门文章

  1. python文件操作和集合(三)
  2. Objective-C block
  3. Last-Modified、If-Modified-Since 实现缓存和 OutputCache 的区别
  4. [codevs 1249] 多边形的面积
  5. window.location.reload() 刷新页面时,如何不弹出提示框
  6. github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...
  7. 在python中等号前面与后面分别是什么意思-Python中冒号等于(:=)是什么意思?...
  8. python如何调用图片-用python简单处理图片(4):图像中的像素访问
  9. python读数据-python读取各种文件数据方法解析
  10. 电脑安装python步骤-python3.8下载及安装步骤详解