我一直在計劃爲我的渲染引擎編寫一個API抽象層。我想包含的兩個API是D3D11和D3D12。 因此,我開始通過爲每個API編寫一些接口和它們各自的實現。API抽象層 - 避免混合API接口
下面的代碼片段examplifies這樣的:
class IDevice
{
//... (pure) virtual methods
};
class CD3D11Device : public IDevice
{
//... virtual method implementations
};
class CD3D12Device : public IDevice
{
//... virtual method implementations
};
到目前爲止好。現在到實際問題: 如果我有一個方法,需要IDevice*
作爲參數的另一個接口,我如何確保「正確的」設備通過?
class ISomeClass
{
public:
virtual void foo(IDevice* pDev) = 0;
};
class CD3D11SomeClass : public ISomeClass
{
public:
virtual void foo(IDevice* pDev) override
{
// should only be passed CD3D11Device
}
};
class CD3D12SomeClass : public ISomeClass
{
public:
virtual void foo(IDevice* pDev) override
{
// should only be passed CD3D12Device
}
};
我知道我可以每次打電話dynamic_cast
在IDevice*
指針和檢查nullptr
但針對的是性能繁瑣和昂貴。
有沒有一些優雅的解決這個問題?你們有沒有人知道專業/商業遊戲引擎如何應對?
你不應該關心哪個'IDevice'類型被傳遞。這就是抽象接口的全部要點。 – juanchopanza
我高舉起來是因爲很多人試圖用他們的圖形引擎來做這種事情。雖然我的經驗有點不同。我嘗試使用任何給定的發行版來堅持一個API版本,以避免所有這些問題。您支持的每個API都會使您必須執行的測試量翻倍。 – Robinson