1

我想从我的 dx12app 调用 IDXGIDevice1::SetMaximumFrameLatency 方法,因为我需要从当前的 Direct3D 12 设备获取有效的 IDXGIDevice1。查询接口返回一个 E_NOINTERFACE:

IDXGIDevice * pDXGIDevice;
HRESULT hr = myDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice);
assert(hr != S_OK); // returns E_NOINTERFACE

IDXGIDevice1 * pDXGIDevice1;
HRESULT hr1 = myDevice->QueryInterface(__uuidof(IDXGIDevice1), (void **)&pDXGIDevice1);
assert(hr != S_OK);  // returns E_NOINTERFACE 

不确定我是否遗漏了某些东西,或者我需要实现一系列 dxgi 逻辑以获得有效的 IDXGIDevice1 接口。

提前感谢任何提示和感谢!剪辑

4

1 回答 1

1

对于 Direct3D 12,不支持这种获取 DXGI 工厂的“传统模式”,因此您上面的代码将无法正常工作,因为这是第一步:

    ComPtr<IDXGIDevice3> dxgiDevice;
    DX::ThrowIfFailed(
        m_d3dDevice.As(&dxgiDevice)
        );

    ComPtr<IDXGIAdapter> dxgiAdapter;
    DX::ThrowIfFailed(
        dxgiDevice->GetAdapter(&dxgiAdapter)
        );

    ComPtr<IDXGIFactory4> dxgiFactory;
    DX::ThrowIfFailed(
        dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory))
        );

对于 Direct3D 12,您应该始终显式创建 DXGI 工厂。请参阅Direct3D 12 创建设备剖析

在 Direct3D 12 交换链中,您明确控制后备缓冲区交换行为。理想情况下,您将使用DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT然后使用可等待对象来限制您的渲染速度。您可以将延迟计数IDXGISwapChain2::SetMaximumFrameLatency设置为默认值 3(MSDN 目前关于默认值是错误的)。

如果您想支持“高于刷新率”的更新(例如 nVidia G-Sync 或 AMD FreeSync),那么您可以DXGI_PRESENT_ALLOW_TEARING使用Present. 有关使用此标志的详细信息,请参阅MSDN或此YouTube视频。

另请参阅DirectX 12:Windows 10 (YouTube) 中的演示模式

于 2016-11-04T16:02:29.527 回答