如何高效地过滤实体组件系统中具有特定值的组件(例如网格位置中的所有实体)?

我正在开发一个基于3D网格的游戏,我正在尝试使用ECS来实现它。

我有一个表示实体在网格上的位置的位置分量。 它由3个整数组成(例如[1,3,2])。 现在可以想象用户点击位置[1,3,2]。 我现在想要有效地检索位置[1,3,2]中的所有实体。

我只能看到一种方法来实现使用ECS。 我需要过滤所有具有位置分量的组件(这可以在O(1)中完成),然后通过所有位置分量进行过滤,只find等于[1,3,2]的位置。 这是非常低效的,因为我有一个十万个实体的位置组件循环,但我只需要它们中的一小部分。

需要注意的是,在任何其他情况下,我都不需要在单个帧中遍历所有十万个位置分量。 对于所有其他系统,我过滤既有位置分量又有其他分量的实体,所以我最终只能循环遍历每一帧中的一小部分位置。 这意味着我不能只是检索所有相关的实体作为循环的一部分,通过所有的位置,因为我没有这样的循环。

传统上使用OOP,我会从一个位置到一个包含所有对象的容器的字典,这将允许我完成O(1)中的上述内容。 从我的理解来看,这不是ECS的正确devise。

我是否误解了实体系统? 如果有人有任何建议,我会很高兴听到它。

谢谢。

基本上你错过了使用ecs系统。 这样的系统不是关于碰撞检测,而是关于组织。 这是一个关于如何计划和组织游戏零件的系统。

所以,现在你接受这个事实,很容易find更多的信息,如何检索实体,如点击和select应用这些实体。

对于这个主要是使用tequniques像评论者提到的空间导向结构,主要是二叉树,像一个八叉树与n,s,e,w,…从每一个点。