Architecture 实体组件系统:放置渲染逻辑的位置

Architecture 实体组件系统:放置渲染逻辑的位置,architecture,entity-system,component-based,Architecture,Entity System,Component Based,我目前正在学习“实体组件系统”。 在阅读了许多教程和论坛帖子之后,我仍然想知道渲染逻辑应该去哪里。我不是在说实际的OpenGL/DirectX渲染代码,例如,它使用一个精灵进行渲染。我的意思是决定渲染哪个精灵的逻辑 可见实体需要三个方面: 评估AI(改变位置、状态等) 评估渲染状态。例如,当实体正在行走、攀爬、被击中时,要使用哪个精灵循环 实际渲染精灵 大多数教程建议使用AISystem(1.)之类的工具来表示逻辑,使用RenderSystem(3.)来显示RenderComponent中定义的

我目前正在学习“实体组件系统”。 在阅读了许多教程和论坛帖子之后,我仍然想知道渲染逻辑应该去哪里。我不是在说实际的OpenGL/DirectX渲染代码,例如,它使用一个精灵进行渲染。我的意思是决定渲染哪个精灵的逻辑

可见实体需要三个方面:

  • 评估AI(改变位置、状态等)
  • 评估渲染状态。例如,当实体正在行走、攀爬、被击中时,要使用哪个精灵循环
  • 实际渲染精灵
  • 大多数教程建议使用AISystem(1.)之类的工具来表示逻辑,使用RenderSystem(3.)来显示RenderComponent中定义的精灵(循环)。他们没有说明RenderComponent的更新位置。 我的理解是,仅仅将(2.)放到(1.)中,从而将字符逻辑与渲染逻辑混合在一起,这将是一个糟糕的设计

    直接的解决方案是为每个敌人添加一个特定的渲染逻辑系统。例如,对于一个Gumba,我可以添加一个gumbalogic系统,一个gumbarenderlogic系统,对于实际渲染,一个通用的SpriteRenderSystem,所有基于sprite的实体都使用它。然而,这意味着为每个实体类型创建两个组件*和两个系统,这似乎不是一个好的解决方案

    有没有一个好的解决方案,可以在保持系统数量较少的情况下分离角色逻辑和渲染逻辑

    多谢各位

    (*=在一种简单的方法中,系统根据其组件处理实体。为了让GumbaRenderLogicSystem在实体上工作,它需要一个GumbaRenderingLogicComponent才能被该系统识别。字符逻辑也是如此。)

    Edit1:我知道ECS是一种抽象模式。我的问题是关于如何保持系统数量少的最佳实践。我的例子来自游戏编程,但不限于此领域。让我用一个更抽象的例子来解释:

    想象一下,我有一个可见的实体。在基于层次结构的体系结构中,我会有如下内容:

    • SomeModel(从AbstractModel继承)
    • SomeController(从AbstractController继承)
    • SomeRenderer(继承自PixelRenderer,而后者又继承自AbstractRenderer)
    在ECS中,我需要一大堆新类:

    • SomeModelSpecificDataComponent(即特定于此语义实体的数据)
    • SomeModelSystem(执行逻辑的)
    • SomeModelSpecificRenderComponent(即呈现特定于此语义实体的数据)
    • SomeModelSpecificRenderLogicSystem(决定如何渲染的系统)
    • 像素渲染系统

    我有没有办法减少需要引入的新系统的数量?一种解决方案可能是添加“代理”或“行为对象”:一般的RenderingComponent附加到某个“RenderingAgent”类的实例上,该类有一个在RenderSystem中调用的方法“Update”。因此,从技术上讲,组件本身并不包含逻辑。不过,我担心这可能是设计过度。

    经过一段时间的思考和多次讨论,我意识到我的思维方式可能是错误的。我所描述的对于香草ECS方法实际上是正确的

    防止系统和组件爆炸的唯一方法是对游戏元素进行适当的抽象,这样可以描述渲染的各种需求,而不是编程

    我的意思是,例如,sprite引擎必须允许足够的抽象,您只能通过存储在渲染系统评估的渲染组件中的描述来表达各种动画和状态。您还需要做的是将解决方案正确地拆分为可重用的部分


    这样,ECS比其他模式更能迫使您真正思考一个好的架构。

    谢谢您的提示,很抱歉给您带来困惑。我添加了更合适的标记。当你说抽象时,你说的是继承吗?或者你真的明白了