2016-12-26 54 views
0

我正在構建一個opengl/directx/vulkan現代遊戲引擎。我以前寫過一個版本的引擎在哪裏分離API特定代碼宏,如:在運行時加載opengl/directx API函數

#ifdef CIANADE_API_OGL 
OGLTexture::GPU_LoadTexture(); 
#elif defined(CIANADE_API_DX12) 
DX12Texture::GPU_LoadTexture(); 
#elif //etc.... 

併爲每個API 平臺我不得不單獨構建(cianade_ogl4.exe,cianade_ogl3.exe,cianade_dx12。 exe等等)。 我的問題是是否有可能,它會是一個好主意在運行時加載opengl和directx API函數動態(僅適用於PC平臺,移動/控制檯將只有一個可執行文件),如果是這樣,如何可能它被完成了嗎?

回答

1

我的問題是是否有可能,這將是載入OpenGL和DirectX API函數是個好主意動態在運行時(只適用於PC平臺,移動/控制檯將只有一個可執行文件),如果那麼,怎麼可能呢?

我不是那些圖形引擎的專家,但是可以在運行時加載底層DLL。

你需要爲特定的庫函數提供包裝的接口,但:

struct IGraphLibTexture { 
    virtual void GPU_LoadTexture() = 0; 
    virtual ~IGraphLibTexture() {} 
}; 

,並提供單獨的DLL的不同的實現。

根據您在運行時確定的目標架構,您可以明確加載其中一個DLL。

如果這實際上是一個好主意,我會讓別人回答。

+0

謝謝:)你認爲加載時間和通話時間可能是一個問題,但?許多功能可能被稱爲**一次**或**兩次**一幀(60 Hz)。 – Coder32

+0

你是什麼意思「在不同的DLL中提供不同的實現」? – Coder32

+0

@ Coder32多態性和vtable引入影響性能是。但對於大多數現代CPU而言,60Hz並不是真正的問題。 –