Architecture 什么使ECS成为ECS 什么使ECS成为ECS

Architecture 什么使ECS成为ECS 什么使ECS成为ECS,architecture,game-engine,amazon-ecs,Architecture,Game Engine,Amazon Ecs,最近在Nim中制作游戏引擎时,我对ECS主题非常感兴趣。Nim有很棒的元编程能力,所以我决定创建一个宏,为任何ECS的正常需要生成一个快速的样板文件 问题是我读到的几乎每一篇文章对这个主题的看法都不一样。例如,有人告诉我们实体只是一个指向所有相关组件的id。我真的很喜欢这个主意,因为它很实用。但问题还是出现了。这种方法要么内存效率低,要么速度慢 一种选择是索引到数组中。此选项在访问组件时速度很快,但会留下大量未使用的内存。假设您有一个只有少数实体使用的巨大组件。如果您拥有数千个实体,那么在最好的

最近在Nim中制作游戏引擎时,我对ECS主题非常感兴趣。Nim有很棒的元编程能力,所以我决定创建一个宏,为任何ECS的正常需要生成一个快速的样板文件

问题是我读到的几乎每一篇文章对这个主题的看法都不一样。例如,有人告诉我们实体只是一个指向所有相关组件的id。我真的很喜欢这个主意,因为它很实用。但问题还是出现了。这种方法要么内存效率低,要么速度慢

一种选择是索引到数组中。此选项在访问组件时速度很快,但会留下大量未使用的内存。假设您有一个只有少数实体使用的巨大组件。如果您拥有数千个实体,那么在最好的情况下,浪费的空间可以计算为兆比特

另一种方法是将它们存储在哈希映射中。这种方法一方面提高了内存效率,另一方面不仅速度慢而且不切实际。组件的顺序可能会不断变化,从而在渲染时产生视觉缺陷。散列也比索引慢得多,而且n(1)不能保证。更不用说,如果容器膨胀,所有的东西都必须重新清洗

下一个技术是二进制搜索(我提出了这个,所以听起来可能很奇怪)与数组相结合。若组件填充良好,我们将使用fast数组。如果很少,我们更喜欢排序数组,并使用bin搜索查找元素。首先,我认为这种方法是完美的,在可用性和性能之间找到了很好的平衡。不过,在基准测试之后,我非常失望地发现,即使是连续排序存储也有很大的缺陷。例如,从长列表中快速删除或插入实体会带来巨大的性能成本。每次删除一个组件时,移动所有元素只会很难,我们需要这样做以保持秩序

除此之外,我还看到了一篇文章,其中指出为了连续存储组件并允许矢量化,必须将它们存储在多个数组集中。这意味着,若实体有这组组件,它将存储在相应的数组中。他们提出了SoA(数组结构)和AoS(数组结构)。对我来说,AoS看起来像是在用对象替换组件时破坏了ECS的整体功能。此外,在本文的术语中,实体实际上比id更复杂。它包含指向SoA或AoS的头以及指向实体本身的索引。然后,向实体添加组件需要将所有组件移动到不同的集合并更改标题

最后结论
在写这一大块文字时,我意识到最后一个选项可能是最好的。主要是因为我可以生成在集合之间移动组件的过程,总体来说,它看起来是最快的,尽管我不确定。它不允许您通过所有组件平滑地迭代。你觉得这一切怎么样?你会怎么做?

那么你的问题是什么?