我编码一个游戏引擎类,我一直建议增加此#定义处理多个API以这种方式:在运行时或编译时更改API?
#ifdef OGL
typedef COpenGl CBaseApi;
#elif defined(OGLES)
typedef COpenGlEs CBaseApi;
#elif defined(DX9)
typedef CDirectX9 CBaseApi;
#elif defined(DX10)
typedef CDirectX10 CBaseApi;
#elif defined(DX11)
typedef CDirectX11 CBaseApi;
#endif
而且我有两个问题:我怎样才能获得以上工作?
我想:
class CBaseAPI
{
//abstract class, virtual functions
}
class COpenGL : public CBaseAPI
{
//implementations
}
但正如我预料它没有工作。
第二个问题是,这种#define方法比使用某种工厂更好吗?我最初是这样做的:
//inside the Main program
myGameEngine.Initialize(GraphicAPI::DirectX11);
//inside the Initialize function
void GameEngine::Initialize(GraphicAPI graphicAPI)
{
switch(graphicAPI)
{
case GraphicAPI::DirectX11:
{
//Defined as private members:
//BaseAPI graphicAPI;
//class CDirectX11 : public BaseAPI
graphicAPI = new CDirectX11();
}
//other cases here
}
}
这些方法有什么优点和缺点,什么是首选吗?
所以你将不得不重新编译来改变渲染API? – Hna
@Hna能够在运行时更改渲染API不值得额外的性能成本。 – Borgleader
@Borgleader不要在运行时改变它。更像是读取命令行参数或用户设置文件,然后选择渲染API。你不能用预处理器指令来做到这一点。 – Hna