使我的游戏独立于C++中的图形API

tho*_*asc 6 c++ design-patterns

我想让我的游戏与所使用的底层图形API无关(为了减少耦合,以防我想将它移植到另一个平台).

我目前正在使用SDL,最初我想将SDL_Renderer封装在GraphicAPI_SDL类中,实现我的通用GraphicAPI接口.此API将创建Image_SDL(封装SDL_Texture),它实现了我的通用Image接口.

我的问题是,当我想使用我的GraphicAPI实例渲染图像时,底层的GraphicAPI_SDL必须将Image转换为Image_SDL,以获得SDL_Texture.这样的演员是丑陋的.

处理这种情况的最佳方法是什么?我将把每个加载在一个向量中的SDL_Texture存储在我的GraphicAPI_SDL中,每个Image的实例只有一个对应于向量中纹理索引的整数,因此只有GraphicAPI_SDL类直接使用SDL,但是有一个更好的方法(例如,使用模式)?

Net*_*ire 0

请参阅Irrlicht,它有一个简单但良好的架构,可以满足您的可移植性标准。基本模式是适配器中介者工厂方法。这种可移植性的关键是良好的界面。GraphicsApi我们需要、MeshRenderer和的抽象类Texture,以及所有图形 API 的实现。

对于 DirectX9:

  • GraphicsApiDX9实施GraphicsApi
  • MeshRendererDX9实施MeshRenderer
  • TextureDX9实施Texture

对于 OpenGL:

  • GraphicsApiGL实施GraphicsApi
  • MeshRendererGL实施MeshRenderer
  • TextureGL实施Texture

等等。GraphicsApiDX9创建TextureDX9保留指向 的内部指针IDirect3DTexture9,以及IDirect3DDevice9创建纹理的 。您正在使用创建的单槽Texture接口,因此您不必关心它是如何创建的。