ECS与DOP(面向数据编程)浅析

序言

以下内容大部分是文字读起来确实会有点繁琐,内容主要是个人对ECS以及DOP的一些理解,如有错误欢迎指出,我觉得如果你正在学习ECS以及DOP,好好地读一下这篇文章是能够给你带来收获的。

什么是DOP

DOP(data-oriented programming),也就是面向数据编程,一种编程范式。与面向对象以及面向函数类似,可以理解为是一种“指导你进行程序设计”的方法。将它与更为熟知的面向对象(OOP object-oriented programming)作比较的话,面向对象更关心“类”之间的关系,而DOP更关心“数据”之间的关系。或者更直白地说,面向数据编程倾向于将“大概率会被一并使用”的数据放在连续的地址空间中,从而提高访问数据时CPU击中的概率,进而提高数据访问的效率。而面向对象则更关心开发人员对抽象关系的理解,也就更易于被理解一点。至于为什么可以提高CPU击中的概率,简单说的话就是CPU也是有缓存的,当一个数据被加载的时候,其附近的数据会被加载到缓存中,而直接从缓存中读取数据要比从内存中读取快得多,这部分不是很理解的朋友们建议还是找一篇文章详细地了解一下,对于理解DOP很有帮助,可以说这就是DOP之所以被提出以及之所以能够实现优化的核心。

举一个简单的例子,当要建立一个森林时,面向对象往往是先建立一个树的类,树包含的树需要的各种信息,比如种植日期,品类,坐标,然后由多个树的对象组成森林。而面向数据可能会选择的方式是,一个叫做森林的数据包含着多个数组,种植日期数组,品类数组,坐标数组,最后我们可以通过一个索引找到一颗树所需的所有数据。这样做的话,一棵树的组成就不像一个类的对象那么直观,但当我们试图访问所有树的种植日期时,面向数据的方式将会比面向对象更加快速,因为种植日期被存储到了连数组中(一段连续的地址空间,支持随机访问)。这只是一个很简单的例子,不要简单地理解为使用数组就是面向数据。个人认为一个优秀的面向数据架构应该是能够在”易于理解“以及优秀的数据读取效率上达到一定平衡的。ECS就是一个很好的例子,在本文的后续会提到。

值得一提的是,虽然都是编程范式,但DOP与OOP并不冲突。或者说我更愿意称其为一种”优化方法“。你大可以在OOP的项目中引入DOP,从而达到优化的目的。这种优化在数据量越大时越明显,特别是在游戏行业中。戴森球是一个典型的DOP项目,具体的内容可以从他们自己的分享文章中查看。

什么是ECS

ECS指的是Entity(实体) Component(组件) System(系统)。简单地描述一下这三者之间地关系,那就是Entity持有component,system通过获取所需地component来完成逻辑运算。一般来说Entity除了Component之外不太会包含别的数据(但还是会保存数据比如版本信息什么的),这应该很好理解,如果Entity把所有数据都直接包含了,那Component还有什么用?换句话说,那他和OOP又有什么区别。对于Component而言,它只关心数据,不包含任何方法,在ECS体系下,方法几乎只应存在与system中。

ECS与DOP的关系

首先明确一

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值