我正在将我的代码从 D3D11 移植到 D3D12,并且我正在尝试在 D3D12 上获取显示器的刷新率。我使用刷新率来进行精确的动画计时(这是一个硬性要求)。此代码适用于 D3D11:
HRESULT GetRefreshRate(IUnknown* device, IDXGISwapChain* swapChain, double* outRefreshRate)
{
Microsoft::WRL::ComPtr<IDXGIOutput> dxgiOutput;
HRESULT hr = swapChain->GetContainingOutput(&dxgiOutput);
if (FAILED(hr))
return hr;
Microsoft::WRL::ComPtr<IDXGIOutput1> dxgiOutput1;
hr = dxgiOutput.As(&dxgiOutput1);
if (FAILED(hr))
return hr;
DXGI_MODE_DESC1 emptyMode = {};
DXGI_MODE_DESC1 modeDescription;
hr = dxgiOutput1->FindClosestMatchingMode1(&emptyMode, &modeDescription, device);
if (SUCCEEDED(hr))
*outRefreshRate = (double)modeDescription.RefreshRate.Numerator / (double)modeDescription.RefreshRate.Denominator;
return hr;
}
不幸的是,ID3D12Device 没有实现 IDXGIDevice 接口,因此 FindClosestMatchingMode1 失败并出现以下错误:
DXGI ERROR: IDXGIOutput::FindClosestMatchingMode: pConcernedDevice doesn't support the IDXGIDevice interface [ MISCELLANEOUS ERROR #69: ]
使用D3D12时有没有办法获取IDXGIDevice?或者,如何确定 D3D12 上的显示刷新率?
但是我知道EnumDisplaySettings
它返回一个整数,因此缺乏精度,导致动画漂移。但是,我还发现DwmGetCompositionTimingInfo
,它似乎只支持获取主监视器的信息。
我还需要一个适用于传统 Win32 和 UWP 应用程序的解决方案。如果需要,我愿意为不同的应用程序模型使用两个代码路径。