制作支持多个图形API的渲染器时,通常需要在与某种图形API(例如OpenGL,Vulkan,D3D11等)绑定的某种低级库中抽象代码。
它们的工作方式彼此非常不同,因此制作一个好的通用API变得至关重要。我已经读到您通常会希望使用一个“后端”来实现要支持的每个API的基本功能,而一个“前端”则是程序员用来在程序上绘制内容的东西。屏幕。
我怎么知道我是否过于严格的抽象?
制作支持多个图形API的渲染器时,通常需要在与某种图形API(例如OpenGL,Vulkan,D3D11等)绑定的某种低级库中抽象代码。
它们的工作方式彼此非常不同,因此制作一个好的通用API变得至关重要。我已经读到您通常会希望使用一个“后端”来实现要支持的每个API的基本功能,而一个“前端”则是程序员用来在程序上绘制内容的东西。屏幕。
我怎么知道我是否过于严格的抽象?
Answers:
首先,考虑支持多个图形API是否真正值得。仅使用OpenGL就可以覆盖大多数平台,并且除了图形上最雄心勃勃的项目外,对其他所有项目都“足够好”。除非您为一个大型游戏工作室工作,该工作室可以花数千个人小时来实施和测试多个渲染后端,并且除非您确实要炫耀某些DirectX或Vulcan特定功能,否则通常不值得麻烦。特别是考虑到您可以使用其他人创建的抽象层(第三方库或游戏引擎)来节省大量工作。
但是,让我们假设您已经评估了自己的选择,并得出结论认为,这样做既可行,又值得花时间推出自己的选择。
然后,抽象层的软件体系结构的主要判断者是前端程序员。
如果是这样,您就成功了。
首先从API的“包装器”部分中确定您实际需要的内容。它通常非常非常简单:您需要基本资源(缓冲区,着色器,纹理,管线状态),以及通过提交一些绘制调用来使用这些资源来构造框架的方法。
尽量保持任何高级逻辑出的 API的包装部。如果您在API的这一部分中实现了一种巧妙的场景剔除技术,那么现在您将可以在所有后端实现中复制该逻辑。这是很多额外的工作,因此请保持简单。场景管理应该是使用包装器的API高层部分的一部分,而不是包装器本身的一部分。
选择您将支持并理解的目标。很难为“所有内容”编写像样的包装,并且您可能不需要(可以说,您也不需要编写单个包装,正如Philipp的回答所述)。如果您不知道要包装的API,则几乎不可能编写一个像样的包装器。
定期评估API的状态。通常,它的表面积应小于底层包装的API。如果您发现自己为每个D3D结构或每个OpenGL函数调用创建一对一的包装器类型,则可能会偏离路线。
看看以前做了什么工作。Sokol和BGFX是提供不可知程度的API,可能对您有用,并且相对容易理解(尤其是前者)。