DXGI SwapChain在监视器上移动窗口时调整缓冲区大小后的当前性能

时间:2019-10-30 23:44:13

标签: graphics directx directx-11 dxgi

我正在创建一个新的具有大窗口尺寸(1080P)的D3D11程序。仅使用最简单的输出(Present之后的ClearRenderTargetView和绘制一个三角形的绘制调用),我发现当我调整SwapChain的大小以响应Windows调整大小消息时,性能(来自任务管理器中的GPU使用情况)变化很大。如果在使用集成的Intel显卡时在主显示器上为窗口重新创建SwapChain,或者在使用专用的NVidia显卡时在第二台显示器上重新创建SwapChain,则调整大小后的性能很好(<5%的GPU使用率,主要来自“ 3D”),但是如果我在使用其他图形卡的同时重新创建SwapChain,使用率将变为30%,并且任务管理器报告GPU使用率来自“复制”。

我想知道适配器和输出之间是否存在关联,以及我们应该如何使用它。

用于创建SwapChain的代码

    DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
    swapChainDesc.Format = WindowDXGIFormat;
    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
    swapChainDesc.BufferCount = 2;
    swapChainDesc.SampleDesc.Count = 1;
    swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
    swapChainDesc.Scaling = DXGI_SCALING_NONE;
    dxFactory->CreateSwapChainForHwnd(Device.Get(), hwnd, &swapChainDesc, 0, 0, SwapChain.GetAddressOf());

其中WindowDXGIFormat被定义为DXGI_FORMAT_R8G8B8A8_UNORM。释放RTV之后,通过IDXGISwapChain1::ResizeBuffers即可轻松调整SwapChain的大小。

请忽略我没有检查从COM API返回的HRESULT的问题。

编辑 我发现IDXGIAdapter具有一个EnumOutputs函数,该函数似乎提供了这种关联关系,但是我仍然不清楚在调用ResizeBuffers时如何控制关联。

0 个答案:

没有答案