Questions tagged «entity»

4
实体系统中的缓存未命中和可用性
最近,我一直在为我的框架研究和实现一个实体系统。我认为我阅读了我能找到的大多数文章,reddits和有关它的问题,到目前为止,我认为我对这个想法已经足够了解。 但是,它提出了有关总体C ++行为,我在其中实现实体系统的语言以及一些可用性问题的一些问题。 因此,一种方法是直接在实体中存储组件数组,而我没有这样做,因为它在遍历数据时破坏了缓存的局部性。因此,我决定每个组件类型只有一个数组,因此相同类型的所有组件在内存中都是连续的,这应该是快速迭代的最佳解决方案。 但是,当我要在实际游戏实现中从系统迭代组件数组以对其进行处理时,我注意到几乎总是同时使用两个或多个组件类型。例如,渲染系统将Transform和Model组件一起使用以实际进行渲染调用。我的问题是,由于在这种情况下不会一次线性地迭代一个连续的数组,我是否立即牺牲了通过这种方式分配组件的性能收益?当我在C ++中迭代两个不同的连续数组并在每个循环中使用两个数组中的数据时,这是否会产生问题? 我想问的另一件事是,应该如何保留对组件或实体的引用,因为组件的本质是如何放置在内存中,它们可以轻松切换数组中的位置,或者可以重新分配数组以进行扩展或扩展。缩小,使组件指针或句柄无效。您建议如何处理这些情况,因为我经常发现自己想在每一帧上对变换和其他组件进行操作,并且如果我的句柄或指针无效,那么在每一帧进行查找都非常麻烦。

2
如何在大型网络世界中处理实体寻路和运动?
考虑到上面的图像将瓷砖分成32x32的框,我有一个实体被标记为“ aggro”附近的玩家。我希望这个怪物理想地追逐玩家(并继续追逐玩家一段时间)。目前,我的唯一动作是使用一个用于远程实体的简单插补器完成的,这是可行的,因为动作更新之间的差距很小。 我不能成功地仅仅告诉客户怪物想要移动到他/她所处的位置,因为这将导致实体移动得比其应该快得多(这可以通过对插值函数使用一些数学运算来解决) -有效),但更重要的是,它看起来不太现实,可能会夹住墙壁!如果可以避免,我不想在服务器上模拟整个运动……虽然我想我可以,但是仍然不能解决裁剪问题。我怀疑该解决方案涉及一些寻路,并向客户端发送定期的节点更新,并让它们模拟运动,但是我不确定。 谢谢!

3
如何在回合制游戏中提升实体组件的游戏状态?
到目前为止,我所使用的实体组件系统的工作原理基本上类似于Java的artemis: 组件中的所有数据 无状态独立系统(至少达到在初始化时不需要输入的程度)对仅包含特定系统感兴趣的组件的每个实体进行迭代 所有系统都处理它们的实体一tick,然后整个过程重新开始。 现在,我尝试将其首次应用于基于回合的游戏,在继续进行之前,必须以相对于彼此的固定顺序进行大量事件和响应。一个例子: 玩家A受到剑的伤害。对此,A的装甲可以踢进并降低受到的伤害。由于变得越来越弱,A的移动速度也会降低。 所遭受的损害是引起整个互动的原因 必须先计算护甲并将其应用于即将来临的伤害,然后再将伤害应用于玩家 直到实际造成伤害之后,才能将移动速度降低应用于某个单位,因为它取决于最终伤害量。 事件还可以触发其他事件。使用装甲减少剑的伤害会导致剑破碎(这必须在伤害减少完成之前进行),进而会引起其他事件,这实际上是对事件的递归评估。 总而言之,这似乎导致了一些问题: 很多浪费的处理周期:大多数系统(保存总是运行的东西,例如渲染)在没有“轮到他们”工作的时候根本没有任何值得做的事情,并且花费大部分时间等待游戏进入有效的工作状态。这会给每个这样的系统带来很多麻烦,随着越来越多的状态添加到游戏中,这些检查会不断增长。 为了确定系统是否可以处理游戏中存在的实体,他们需要某种方式来监视其他不相关的实体/系统状态(负责处理损害的系统需要知道是否已使用装甲)。这要么使系统承担多重责任,要么产生对其他系统的需求,而没有其他目的,只能在每个处理周期之后扫描实体集合,并通过告诉侦听器何时可以做某件事与一组侦听器进行通信。 以上两点假设系统在同一组实体上运行,最终使用其组件中的标志更改状态。 解决此问题的另一种方法是,由于单个系统的工作而增加/删除了组件(或创建了全新的实体),从而提高了游戏状态。这意味着,每当系统实际具有匹配实体时,它都知道可以对其进行处理。 但是,这使系统负责触发后续系统,因此很难对程序行为进行推理,因为单个系统交互不会导致错误的出现。添加新系统也变得更加困难,因为无法在不知道它们如何影响其他系统的情况下无法实施它们(并且可能必须修改先前的系统以触发新系统感兴趣的状态),这有点违反了拥有单独系统的目的一个任务。 这是我必须忍受的东西吗?我所看到的每个ECS示例都是实时的,并且很容易看到这种“每游戏一个迭代”循环在这种情况下的工作方式。而且我仍然需要它来进行渲染,这似乎真的不适合每次发生某些事情时都会暂停其大部分功能的系统。 是否存在一些适合于此的将游戏状态向前移动的设计模式,还是我应该将所有逻辑移出循环而仅在需要时才触发它?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.