我一直在计划为我的渲染引擎编写一个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