私はレンダリングエンジンのAPI抽象化レイヤーを作成する予定です。私が含める2つの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
}
};
私はIDevice*
ポインタに毎回dynamic_cast
を呼び出し、nullptr
をチェックすることができることを知っているが、それは、パフォーマンスに関してで面倒なだけでなく、高価です。
この問題の解決方法はありますか?プロ/商用ゲームエンジンがそれにどのように対処しているか知っていますか?
どのIDevice型が渡されているかは気にしないでください。それが抽象的なインターフェースの全体のポイントです。 – juanchopanza
私は多くの人がグラフィックスエンジンでこの種のことをしようとしているので、私は賞賛しました。私の経験はちょっと違います。私は、特定のリリースで1つのAPIバージョンに固執しようとしているので、これらの問題はすべて避けてください。サポートするすべてのAPIは、実行するテストの量を倍増させます。 – Robinson