问题标签 [data-oriented-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
599 浏览

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

我看到了 Mike Acton 的“面向数据的设计和 C++”,我觉得它很有趣。我不明白如何解决数据依赖关系。

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

图形数据和声音数据取决于存储在物理数据中的位置。可以从物理数据中引用位置,但在我看来,这会扼杀 DOD 的全部意义——在同一内存位置拥有所需的数据。

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

0 投票
3 回答
110 浏览

c++ - 如何使用 C++ 读取文件并基于输入文件构建数据结构?

我想这应该是可能的。我试过但找不到一个好的答案。我基本上想制作一个动态结构。我想读取一个文件,它告诉我我的结构将包含的数据类型。基于这些价值观,我想建立一个结构。我想为此使用 C++。我们可以将 oracle 视为一个示例,我们提供一个 csv 文件,它会识别它们应该是什么类型并制作该特定数据类型的列。

谁能帮我解决这个问题?

更新:我想我应该添加一点代码来解释我的问题陈述。所以我们开始:

这段代码现在对我有用,并在我调用 GetHeader 时解决了我的目的。正如大家所见,它正在从 PLC 中寻找准确的字节和结构。我想制作一个系统,以便可以从一个文件中制作结构,这样只有一个文件应该被替换,然后系统应该自己工作。我想我可以探索一些关于工厂设计模式的事情来做到这一点。现在我可以确定我的数据结构构造的文件类型和文件内容。有没有人在那边做过类似的事情。

0 投票
2 回答
2671 浏览

c++ - 用于 SoA/AoS 内存布局的 C++ 零成本抽象

假设我有一个使用结构数组 (AoS) 内存布局的大型代码。我想在 C++ 中构建一个零成本的抽象,它允许我在 AoS 和 SoA 之间切换,而重构工作尽可能少。例如,使用具有访问成员函数的类

在循环中的容器内使用

我想更改第一个片段,而第二个片段保持相似..例如有类似的东西

我可以在其中选择带有“SoA”或“AoS”模板参数的内存布局。我的问题是:这样的东西是否存在于某个地方?如果没有,最好如何实施?

0 投票
1 回答
1405 浏览

interface - 面向数据设计中的接口

谚语是这样的:

“编程到接口/抽象,而不是实现”。

我们都知道接口是面向对象编程中解耦的一种手段。就像某个对象履行的合同一样。

但我无法理解的是:

如何在面向数据的设计中对接口/抽象进行编程?

就像调用一些“Drawable”一样,但我现在不知道它是矩形还是圆形,但它实现了接口“Drawable”。

谢谢

0 投票
4 回答
757 浏览

c++ - 关于快速 SIMD / 面向数据设计的内存布局的直觉

我最近一直在看面向数据的设计讲座,但我一直不明白他们一致选择的内存布局背后的原因。

假设我们有一个 3D 动画要渲染,并且在每一帧中我们需要重新规范化我们的方向向量。

“标量代码”

他们总是显示可能看起来像这样的代码:

到目前为止一切都很好...... 的内存&scene可能看起来大致是这样的:

“SSE 感知代码”

然后每次谈话都会显示改进的千篇一律的版本:

由于它的内存布局,不仅内存效率更高,而且一次可以处理我们的场景 4 个对象。
内存在&xs, &ys, &zs, 和&ws

但是为什么有 4 个独立的数组呢?

如果__m128(packed-4-singles)是引擎中的主要类型,
    我相信它是;
如果类型是 128 位长,
    那肯定是;
如果缓存线宽/128 = 4,
    它几乎总是这样;
如果 x86_64 只能写入一个完整的缓存行,
    我几乎可以肯定
- 为什么数据的结构不如下?!

内存在&packed_orientations

我没有基准来测试它,而且我对内在函数的理解还不够,甚至无法尝试,但是根据我的直觉,这不应该更快吗?我们将节省 4 倍的页面加载和写入,简化分配,并节省指针,并且代码会更简单,因为我们可以做指针添加而不是 4 个指针。我错了吗?

谢谢!:)

0 投票
0 回答
69 浏览

c++ - 使用专用线程更新粒子会降低性能

我有一个使用面向数据的设计的 boids 模拟,并且没有任何线程代码,它以 30 fps 运行。我决定使用专用线程来更新 boids 来提高性能,但性能从 30 fps 变为 10 fps。数据是全局的,因此它可以被任何线程访问

一开始我以为是错误共享的问题,所以我尝试只用一个线程运行更新代码,但与非线程版本相比,我的 fps 仍然很低。值得一提的是,主线程只访问要读取(渲染)的数据,从不写入。抱歉,如果代码太多,但我尝试提取其中最重要的部分,以便您了解它是如何工作的。

正如我所提到的,如果我只使用一个工作线程运行此代码,那么性能就会被丢弃。我真的不知道会是什么。

0 投票
0 回答
80 浏览

javascript - 如何迭代两个共享公共属性的数组?

我一直在使用前端的 Pixi.js 在 JavaScript 中开发一个非常苗条的实体组件系统,我有一个问题要问你们一个常见的模式是你在系统中使用的迭代器,例如在 Unity 中你可以这样做:

假设您有一个实体数组和两个包含这些组件类型的数组,需要调用一个函数并将这两个组件作为参数传递,您将如何在后台构建该 forEach 函数?本质上,迭代具有两种类型组件的实体的最优化方法是什么?

简单的方法似乎是迭代实体列表并检查它们的组件类型,但我想知道是否有更好的方法。这种方法看起来像这样:

0 投票
1 回答
96 浏览

game-engine - 使用实体组件系统如何确保一组组件类型中最多存在一个组件(每个实体)?

我使用 ecs 有一段时间了,但有一个问题我找不到一个很好的、主要是通用的解决方案。有一组类型,其中最多一个应该与一个实体相关联。前任。有一些触发逻辑。可以在通常的并行迭代中一次评估所有触发器(具有相同类型)。一切正常,但在单个实体上设置多个触发器是没有意义的。现在,我有各种清理和健全性检查系统(任务),在创建新触发器类型时必须始终更新这些系统(任务)。(编辑在更新时,我指的是源代码而不是运行时。)在传统的 oop 中,这将是微不足道的:将每个实体的单个指针存储到基本类型,派生并实现新的绑定器,仅此而已。在 ecs 中,它们存储在不同的存储中,我没有一个好的解决方案来确保对它们进行某种互斥。

感谢您的任何建议。

0 投票
2 回答
3871 浏览

oop - 与 OOP(或其他范式)相比,ECS(实体-组件-系统)架构模式有哪些缺点?

因为 Unity ECS,我最近阅读了很多关于 ECS 的内容。

ECS 架构有很多明显的优势:

ECS是面向数据的:数据倾向于线性存储,这是系统访问它的最佳方式。在体面的 ECS 实现中,数据是按顺序存储和处理的,对于任何给定的系统处理它的组件集几乎没有中断或没有中断。

ECS 是非常分区的:它自然地将数据与行为分开,强制“组合而不是继承”(google it)等。

ECS 对并行处理和多线程非常友好:由于事物的结构化方式,许多实体和组件可以避免冲突并与其他系统并行处理。


然而,ECS 的缺点(与 OOP 或实体组件 [无系统] 相比,直到最近在包括 Unity 在内的游戏引擎中很常见)很少被谈论,如果有的话。它们存在吗?如果他们这样做,他们是什么?

0 投票
1 回答
2975 浏览

c# - 如何在 Unity ECS 中获取 ComponentDataFromEntity 到并行作业?

我正在尝试在并行作业中访问实体组件数据。组件数据的类型为PheromoneComponent。定义作业的结构如下所示:

该作业使用以下实例执行:

代码运行,但每次调用更新时我都会收到以下错误消息:

由于我从未明确定义过,ComponentDataFromEntity因为[WriteOnly]这个错误似乎表明并行工作中存在一些冲突。我ComponentDataFromEntity是否正确通过?还有其他我不知道的陷阱吗?我还有其他一些正在运行的工作,PheromoneComponent但我尝试禁用它们并且错误仍然存​​在。此外,我猜 ECS 作业系统应该注意在执行另一个作业之前完成所有作业依赖项。

我也尝试过[NativeDisableParallelForRestriction] ComponentDataFromEntity<PheromoneComponent>而不是[ReadOnly] public ComponentDataFromEntity<PheromoneComponent> pheromoneDataArray;但没有改变。

任何帮助或解释将不胜感激!