我应该在哪里使用SDL2和C ++使用ECS的SDL_Renderer *?

所以我还在学习ECS(实体组件系统),每当我想到架构和实际的实现,我只是不知道我应该把SDL_Renderer *放在哪里。

到目前为止,我所学到的是Entity类应该有它自己的唯一ID,应该有一个Component和System类,RenderComponent和RenderSystem应该从它们派生出来。 RenderComponent应该包含所有的数据,RenderSystem应该包含实际的algorithm(如果我错了,请纠正我的错误)。

我正在使用C ++和SDL2,我不知道你们是如何,但我从来没有真正使用过多个SDL_Renderer,我也不打算这么做。 我总是为窗口创建一个渲染器,并将所有内容复制到该渲染器,然后将该渲染器呈现给屏幕。 所以我的问题是:

  • 在像我上面解释的ECSdevise中,我应该在哪里放置我的SDL_Renderer?
  • RenderComponent和RenderSystem应该包含什么?

如果只有一个SDL_Renderer,则应该在ECS代码之外进行管理,并在您调用渲染系统以呈现每个实体的可视数据时传递给渲染系统。 这样就好像您将单个SDL_Renderer与所有可渲染实体关联起来一样。 如果出于某种原因,您有多个不同的configuration的SDL_Renderer对象,使用不同的实体集合,那么将SDL_Renderer对象表示为实体本身(通过为存储指向SDL_Renderer对象的实体的RendererComponent) 。 然后,您可以将这些渲染器实体的ID存储在每个可渲染实体的可视化数据组件中,以便渲染系统可以获取渲染每个实体所需的正确渲染器。

编辑:澄清我的第一个评论,这里是一些代码:

void RenderingSystem::Update(SDL_Renderer *renderer) { for (int i = 0; i < this->GetEntityCount(); ++i) { Entity *entity = this->GetEntity(i); SpatialComponent *spatialComponent = entity->GetComponent<SpatialComponent>(); VisualComponent *visualComponent = entity->GetComponent<VisualComponent>(); SDL_Rect dstrect = visualComponent->srcrect; dstrect.x = spatialComponent->positionX; dstrect.y = spatialComponent->positionY; SDL_RenderCopy( renderer, visualComponent->texture, &visualComponent->srcrect, &dstrect ); } }