IDXGIFactory 接口的引用告诉我,为了创建交换链,我可能会使用与创建 Direct3D 设备相同的工厂:
因为您可以在不创建交换链的情况下创建 Direct3D 设备,所以您可能需要检索用于创建设备的工厂以创建交换链。
它还提供了以下代码示例:
IDXGIDevice * pDXGIDevice;
hr = g_pd3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice);
IDXGIAdapter * pDXGIAdapter;
hr = pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&pDXGIAdapter);
IDXGIFactory * pIDXGIFactory;
pDXGIAdapter->GetParent(__uuidof(IDXGIFactory), (void **)&pIDXGIFactory);
这篇文章非常冗长,当试图完全理解它时,出现了以下两个问题,而第一个问题是主要问题(关于这个线程的标题):
为什么我必须使用与创建 Direct3D 设备相同的工厂才能创建交换链?工厂实例是否维护一个重要的内部状态,或者只是为了避免创建另一个消耗资源的工厂实例?
此外,在代码示例中,我遇到了以下代码行:
hr = pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&pDXGIAdapter);
对我来说,IDXGIAdapter 是 IDXGIDevice 的父级是不合逻辑的。否则,我希望IDXGIAdapter有一个像 CreateDevice 这样的方法,它会使适配器成为设备的父级。但事实并非如此。为什么适配器是设备的父级?