簡體   English   中英

在運行時或編譯時更改API?

[英]Changing APIs in run-time or compile-time?

我正在編碼一個游戲引擎類,建議我添加此#define以這種方式處理多個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
    }
}

這些方法有什么優點和缺點,首選的方法是什么?

您似乎具有與基類(CBaseApi)相同名稱的typedef。 那樣不好。

您的意思是:

class CBaseAPI
{
    //abstract class, virtual functions
};
class COpenGlEs : public CBaseAPI
{
    // implementations  
};

#ifdef OGL
    typedef COpenGl BaseApiImpl;
#elif defined( OGLES )
    typedef COpenGlEs BaseApiImpl;
#elif defined( DX9 )
    typedef CDirectX9 BaseApiImpl;
#elif defined( DX10 )
    typedef CDirectX10 BaseApiImpl;
#elif defined( DX11 )
    typedef CDirectX11 BaseApiImpl;
#endif

第二個太可怕了。 兩階段初始化非常容易出錯,在一般情況下,絕對不需要您的游戲在運行時更改渲染API。 使用接口和繼承完全浪費時間和性能,更不用說丟掉漂亮的強類型了。

對於#define,不需要通過繼承鏈接類。 使用模板可能會做得更好,但是條件編譯是針對預處理程序進行的。 簡單的使用場景:

class OGL {
public:
    void dostuff();
};
class DX {
public:
    void dostuff();
};
class GameEngine {
#ifdef USE_OPENGL
    OGL BaseAPI;
#else
    DX BaseAPI;
#endif
public:
    void dostuff() { BaseAPI.dostuff(); }
};

還有,CClass? 哎呀 您需要找到新的學習材料,伙計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM