我編碼一個遊戲引擎類,我一直建議增加此#定義處理多個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