实体组件系统 - 需要彼此的组件



我已经为我的游戏(C++)编写了一个实体组件系统。然后,我重构了我的渲染系统,以使用实体/渲染组件,而不是一些虚拟的可绘制界面。它们是一些类,我认为强迫它们成为一个组件没有太大意义。其中一个类是地图。

我的地图类由平铺地形类和一些其他数据(不重要)组成。平铺地形类以(目前)TiledTerrainLayer类的形式管理多个图层。在重构渲染系统之前,我只是继承了DrawableTransformable,以使渲染系统能够绘制此类。现在它需要是一个至少具有TransformComponent和一些RenderComponent的实体。

现在,TiledTerrainLayerRenderComponent实际上应该只拥有顶点和纹理的引用,也许还有一个标志,表明它是否已创建。然后,TiledTerrainComponent将拥有瓷砖猥亵列表以及切片和地图大小。

现在我的问题是,当我设置一个图块(使用类似SetTile(size_t tileIndex, const Position & pos)的方法)时,我还必须更新顶点数组的纹理坐标。

我通常对一个组件需要另一个组件感到满意。例如,SpriteRenderComponent需要TransformComponent,我也对一个组件访问另一个组件的信息很好。例如,GetBoundingBox() 方法使用转换组件的位置。

我想避免的是两个组件相互"交叉引用",就像TiledTerrainComponent(TTC)和TiledTerrainRenderComponent一样。(特雷克)(TTRC 获取 TTC 的 tileIndexList 来创建自身,TTC 在调用其 SetTile() 方法时调用 TTRC 的 UpdateVertices() 方法。

最后,我知道组件应该主要是数据。我只添加了直接获取或修改该数据的方法,例如 SetTile() 或 GetTexture()。在上述情况下,系统是否可行,如果是,它将是什么样子?

听起来你在这里所需要的只是一个脏旗。

当您更改平铺地形上的平铺索引、大小或其他属性时,您不会立即致电平铺渲染器来更新其顶点(毕竟,您可能有许多平铺更新尚未到来 — 每次重新计算顶点可能会浪费)

相反,平铺地形渲染器只是将其内部hasBeenModifiedSinceLastUse标志设置为 true。它根本不需要了解渲染器。

接下来,在绘制之前更新平铺渲染器时,它会询问其平铺地形自上次绘制以来是否已更新(如果要定位更改,甚至可以查询更新列表)。如果是这样,您可以批量更新顶点,以获得更好的代码和数据局部性。

在此过程中,您将重置修改后的标志,以便在后续帧上没有更新时,您可以按原样重用上次生成的顶点集。

现在,依赖项仅指向一种方式 — 渲染器依赖于磁贴数据,但磁贴数据除了维护其标志外,对渲染一无所知。

最新更新