我正在创建一个新的具有大窗口尺寸(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
时如何控制关联。