Articles of 系统

ECS:循环实体的许多系统的性能

我一直在使用ECS来处理当前的游戏,并且我注意到我提出了很多系统,这些系统会覆盖有时重叠的实体列表,所以我不止一次在同一个实体上循环播放超过一次一个系统正在处理同一个实体。 如果只是遍历所有应该更新的实体,那么是不是更好? 如果是的话,你会怎么做? 重新devise系统,让单个系统负责相同实体上的更多内容? 将代码从系统移动到组件上的update()方法? 或者我只是担心一些对性能没有太大影响的事情,而采取不同的做法可能会产生其他的瓶颈呢?

实体多态性和实体属性

我想以这样一种方式来devise我的游戏的实体系统:实体是模块化的,容易修改而不影响其他实体,最后容易添加新types的实体。 所以最好是基于组件的devise的一些版本。 在代码的一些部分,我想通常和抽象地处理实体,例如“更新所有实体”和“渲染所有实体”,但是在其他部分,我想处理特定types的实体,比如当士兵实体打一个坦克实体。 问题是一些实体需要其他人不需要的属性。 例如一名士兵需要惠普,但一枚导弹不需要。 如何保持实体属性模块化,并避免将游戏中的每个属性添加到实体对象?

通过公共variables或公共成员函数在实体组件中进行通信

我目前正在编写自己的ECS,以深入了解这种引擎的工作原理。 我目前正在组装系统。 我知道我的问题没有正确的答案,因为ECS有很多口味。 也许我应该说,我现在试图避免一个事件队列。 所以我只想做同步和直接的沟通。 请注意,这是我的asynchronous通信系统和事件系统的基础和准备。 你们如何看待你的组件? 你提供系统直接访问的公共variables,还是你通过公共成员函数进行通信? 公共variables class AIComponent : public IComponent{ public: bool m_LeftPressed = bool(); } 公共成员函数 class AIComponent : public IComponent{ private: bool m_LeftPressed = bool(); public: bool leftPressed(); }

在实体组件系统中实现状态驱动的代理

状态驱动的代理是基于当前状态执行操作的代理。 逻辑可以通过使用一个D-FSM来实现,该D-FSM根据代理的“感知”和“刺激”改变状态,并且执行进入,进入和退出状态的动作。 我试图在实体 – 组件系统(ECS)体系结构中实现这种types的devise。 我的第一个想法是实现一个包含current_state和规则手册的“FSM”组件,一个根据规则手册更新FSM组件current_state的系统,以及一个实现实体动作的系统(并相应地修改其组件) FSM组件的状态。 我不确定这是一个正确的ECS实现,它可以干净地表示enter_state / exit_state – >执行操作行为。 那么,如何在ECS架构中实施SDA呢?

与ECS中的碰撞系统进行通信

我已经阅读了大量有关ECS的文章和论坛主题,但仍然无法理解引擎中的任何内容应该如何与碰撞系统进行通信。 比方说,我有一个input系统来处理键盘input,然后在某个时候想要向前移动玩家角色。 在这之前,我应该问碰撞系统,如果在移动之后会发生碰撞,并且只有在没有改变位置的情况下。 我目前的做法是在CollisionSystem中具有这样的翻译function和对象的请求翻译function: moveForward(){ V3.CollisionSystem.requestTranslation(this.mesh, function(object){ object.translateZ(-this.movingSpeed); }.bind(this)); } 你对这种方法有什么看法? 它有多好/坏? 什么是已知的select?

使用基于实体组件的系统体系结构处理移动

我已经看到了如何在基于组件的entity framework中处理移动的各种描述。 我偶然发现的最常见的是使用名为Controller , Physics , Transform , Velocity和Collider的组件的想法。 这里的想法是,当检测到移动击键时, 控制器影响速度分量。 速度组件反过来影响物理 。 一旦模拟已经步进,如果发生碰撞,碰撞器或者不发生碰撞,则不受影响。 最后, 变换在物理模拟步骤中更新为新的位置,因此需要调整Renderable以便将其绘制在适当的位置。 我经常读到,需要考虑物理驱动和非物理驱动的实体。 如上所述,操纵物理驱动的实体似乎是一块蛋糕。 与非物理驱动实体的不同之处在于, 速度分量值需要简单地应用于基于增量时间的变换 。 这将允许移动实体而不关心物理或碰撞检测。 对于物理驱动的实体,只需要用Velocity和Physics组件迭代实体。 但是对于非物理驱动的实体,仅仅使用Velocity组件迭代实体是不够的,因为它也包括上述子集。 所以必须有一些因素清楚地区分这两种情况。 因此,考虑到这两种情况,在这样一个系统中如何进行影响速度值的运动动作来操纵这两种types的实体,无论物理学是否在运动中起作用? 最后,考虑到有时候需要直接操纵一个实体的变换,例如玩家点击一个传送到另一个X / Y / Z位置的门户,如何正确传播这个变化来调整物理步骤simultation和可渲染的绘制位置? 编辑:@bobenko你的解释提供了洞察对象是通过物理模拟的最常见的情况,但我有点失去了运动方面有关通过速度值更新实体位置? 你是否只是暗示我自己的一些代码将通过速度来运动到实体,因此是运动的? 如果这些组件涉及的方面发生变化,我仍然对如何避免循环通知的解释感兴趣。 对于所有回答者,我仍不清楚你将如何处理一个实体从一个位置传送到另一个位置? 这涉及到closures物理,传送玩家,然后在传送完成后打开物理? 打开/closures物理function可以简单地将实体设置为可以运动的YES / NO,对吗?

为什么组件系统中的实体在运行时组成?

为什么实体组件系统是这样的? 例如,据我所见,它可能看起来像这样 class Entity list of components add component remove component update comentent …. 所以你在运行时建立你的实体。 我认为这将是这样的 Entity ork; ork.add(AI).add(movement).add(physics).add(renderer) 我用这种方法看到的问题是错误出现在运行时而不是编译时。 它也似乎增加了很多潜在的错误,例如,如果实体也有移动组件,AI系统才有意义。 以这种方式构建对象的好处是什么,而不是像这样做? class Ork: IEntity movementComp AiComp physicsComp rendererComp …. //wire everything together 我可以看到的一个可能的优点是创建对象需要更less的代码,因为您不需要连接对象,只需添加组件和完成。 你能开导我吗?