Architecture 面向数据的设计-如何解决数据依赖关系?

Architecture 面向数据的设计-如何解决数据依赖关系?,architecture,data-oriented-design,Architecture,Data Oriented Design,我看到了,觉得很有趣。但我不明白数据依赖关系是如何解决的 假设我有一个简单的2d引擎,带有: *物理数据-处理物理 *图形数据-渲染精灵 *声音数据-播放声音 图形数据和声音数据取决于物理数据中存储的位置。位置可以从物理数据中引用,但在我看来,这扼杀了国防部的全部观点——在相同的内存位置中拥有所需的数据 在面向数据的设计中如何处理这种情况?不确定是否完美,但如果您的ID或句柄在整个物理和图形子系统中共享,您可以让物理子系统生成所有更新对象的位置和ID/句柄数组,并将其用作图形子系统的输入。国防部

我看到了,觉得很有趣。但我不明白数据依赖关系是如何解决的

假设我有一个简单的2d引擎,带有: *物理数据-处理物理 *图形数据-渲染精灵 *声音数据-播放声音

图形数据和声音数据取决于物理数据中存储的位置。位置可以从物理数据中引用,但在我看来,这扼杀了国防部的全部观点——在相同的内存位置中拥有所需的数据


在面向数据的设计中如何处理这种情况?

不确定是否完美,但如果您的ID或句柄在整个物理和图形子系统中共享,您可以让物理子系统生成所有更新对象的位置和ID/句柄数组,并将其用作图形子系统的输入。

国防部是设计体系结构的一种通用方法,重点是如何首先高效地表示数据。做这件事没有什么特别的方法。Linus Torvalds展示了对Linux内核和Git等的这种心态,但它是一个与游戏截然不同的领域。主要的是,他首先关注的是如何高效地表示数据

作为一个基本的例子,如果您正在设计一个图像处理应用程序,那么如果您不是以面向数据的方式思考,而是专注于如何最容易地支持最广泛的像素格式,并提供最简单的使用界面,您可能会提出一个抽象的
像素
,甚至可能是每个像素的堆分配。在这一点上,您需要支付虚拟指针(通常大于像素本身)、每像素动态调度、可能的另一层间接寻址以及可能的空间位置完全丢失的成本。相反,如果您首先考虑如何有效地表示数据,那么您可能会在更粗糙的
图像
级别(像素的抽象集合,对于给定图像可能有数百万像素)进行抽象,而不必为每像素级别的开销付费

也就是说,对于游戏来说,通常处理您正在谈论的内容的常用方法是集中访问数据。这似乎违反了SE原则,但通常如果您使用实体组件系统之类的东西,任何给定类型的组件通常只能由少数系统访问。因此,数据的范围往往很小,足以有效地维护不变量

对于游戏中可能发生的事件,例如声音系统可能想要播放声音的物理系统中的两个实体相互碰撞,有许多方法可以使物理和声音系统彼此解耦。一种是使用事件队列

至于一个系统所需的数据也被另一个系统共享,这通常是非常实用的。如果您想让这些系统彼此并行运行,它们仍然必须复制共享数据,可能会对其进行更新,并以某种方式协调它们的结果。也就是说,在我看来,避免对其进行处理,而只是将系统正在做的事情并行化(例如:使用并行for循环)会更有效率,因为通常ECS中只有少数几个系统是热点,并且执行非常繁重的任务,您可以轻松地跨线程分配这些特定系统的工作,而无需尝试同时运行多个系统并打开可能的蠕虫