作为问题,我使用d3d11设备查询ID3D11VideoDevice ptr,但是这个查询花费了将近32秒。
成员介绍:
ID3D11Device* m_Device;
ID3D11DeviceContext* m_DeviceContext;
IDXGISwapChain1* m_SwapChain;
ID3D10Multithread* p_mt = nullptr;
ID3D11VideoDevice* d3d11_video_device_ = nullptr;
ID3D11VideoContext* d3d11_video_context_ = nullptr;
下面是Create Device、SwapChain和video_device查询的过程:
D3D_FEATURE_LEVEL feature_levels_in[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1 };
D3D_FEATURE_LEVEL feature_levels_out;
hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,
creation_flags, feature_levels_in,
sizeof(feature_levels_in) / sizeof(D3D_FEATURE_LEVEL),
D3D11_SDK_VERSION, &m_Device, &feature_levels_out,
&m_DeviceContext);
if (FAILED(hr)) {
return false;
}
// SwapChain
RECT WindowRect;
GetClientRect(m_WindowHandle, &WindowRect);
UINT window_width_ = WindowRect.right - WindowRect.left;
UINT window_height_ = WindowRect.bottom - WindowRect.top;
DXGI_SWAP_CHAIN_DESC1 desc;
ZeroMemory(&desc, sizeof(DXGI_SWAP_CHAIN_DESC1));
desc.BufferCount = 2;
desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc.Height = window_height_;
desc.Width = window_width_;
desc.Scaling = DXGI_SCALING_STRETCH;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
desc.Stereo = false;
desc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
CComPtr<IDXGIDevice2> dxgi_device;
hr = m_Device->QueryInterface(__uuidof(IDXGIDevice1),
(void**)&dxgi_device);
if (FAILED(hr)) {
return false;
}
Microsoft::WRL::ComPtr<IDXGIAdapter> adapter = nullptr;
Microsoft::WRL::ComPtr<IDXGIFactory2> factory = nullptr;
hr = dxgi_device->GetAdapter(&adapter);
if (FAILED(hr)) {
return false;
}
hr = adapter->GetParent(IID_PPV_ARGS(&factory));
if (FAILED(hr)) {
return false;
}
hr = factory->CreateSwapChainForHwnd(m_Device, m_WindowHandle, &desc, nullptr, nullptr, &m_SwapChain);
if (FAILED(hr)) {
std::string message = std::system_category().message(hr);
return false;
}
p_mt->Enter();
if (!d3d11_video_device_) {
// this query option cost nearly 32 secs
//hr = m_Device->QueryInterface(__uuidof(ID3D11VideoDevice),
// (void**)&d3d11_video_device_);
hr = m_Device->QueryInterface(&d3d11_video_device_);
if (FAILED(hr)) {
return Return;
}
}
if (!d3d11_video_context_) {
hr = m_DeviceContext->QueryInterface(__uuidof(ID3D11VideoContext),
(void**)&d3d11_video_context_);
if (FAILED(hr)) {
return Return;
}
}
我尝试使用其他查询方式,失败;
我想知道为什么这个查询过程耗时太多,如何减少?