创建 DXGIFactory

Create DXGIFactory

提问人:Anaph 提问时间:11/8/2023 最后编辑:Simon MourierAnaph 更新时间:11/8/2023 访问量:49

问:

创建 IDXGIFactory1 然后查询 IDXGIFactory5 的任何原因:

CreateDXGIFactory1(IID_PPV_ARGS(&factory));
factory->QueryInterface(IID_PPV_ARGS(&factory5));

而不仅仅是创建 IDXGIFactory5:

CreateDXGIFactory1(IID_PPV_ARGS(&factory5));

?

当 factory5 具有 factory1 的所有方法时,为什么我在同一应用程序中需要两个不同的接口版本(factory1 和 factory5)(我认为这不是为了向后兼容)?

、 和 、 的相同问题。ID3D11DeviceID3D11Device5ID3D11DeviceContextID3D11DeviceContext4

DirectX Direct3D11 DirectX-12 DXGI

评论


答:

-1赞 Simon Mourier 11/8/2023 #1

自 Windows Vista 以来,DXGI 随 Windows 一起提供。因此,随着较新版本的 Windows 的出现,DXGI 的更新版本也随之而来。

您没有看到官方文档中反映这一点,因为 Microsoft 只提到了迄今为止支持的版本(这不是 100% 正确的,但我们经常看到这一点)。

因此,由于文档页面显示以下内容:IDXGIFactory5

enter image description here

这意味着在 Windows 10 上受支持(截至今天仍受支持)。如果你检查页面,它说:IDXGIFactory5IDXGIFactory6

enter image description here

我们无法回到过去,但是,例如,Windows 7仅支持DXGI 。IDXGIFactory2

您还可以检查头文件(dxgi1_5.g、dxgi1_6.h 等),因为有时文档是错误的......但。。。标头也可以使用较新版本的 SDK 进行修改。

至于直接使用,它应该可以工作(如果可以,那就没问题了),因为这是首先接受 IID 类型参数的目的,但经验表明,有时由于某种原因,底层实现不支持这种快捷方式。CreateDXGIFactory1(IID_PPV_ARGS(&factory5));

注意:您也可以在较低版本的 Windows 上使用完全相同的代码,其中您应该收到错误,这是预期和正常行为。E_NOTINTERFACE

Direct3D 和 Direct2D 对象模型(以及整个基于 Windows COM 的 API)的情况大致相同。

评论

0赞 Anaph 11/8/2023
所以据我了解,如果我想支持多个 Windows 版本,我需要这个?例如,我想支持 Windows 10 和 Windows 7,那么我应该使用 CreateDXGIFactory1() 创建 IDXGIFactory1,然后尝试查询 IDXGIFactory5。然后,对于常用方法(在 IDXGIFactory1 和 IDXGIFactory5 中),我应该使用 IDXGIFactory1(这保证它们将在两个版本的 Windows 上工作)和新方法(仅限 Windows 10)- IDXGIFactory5?
0赞 Simon Mourier 11/8/2023
是的,应始终使用最小的版本号(如果可能),以保证与旧版本的 Windows 的最大兼容性。如果你确实需要一些更高的数字版本,你可以为它 QueryInterface,如果你遇到错误,要求用户升级 Windows
0赞 Anaph 11/8/2023
非常感谢