D3D11CreateDeviceAndSwapChain 慢

Posted

技术标签:

【中文标题】D3D11CreateDeviceAndSwapChain 慢【英文标题】:D3D11CreateDeviceAndSwapChain slow 【发布时间】:2017-07-19 16:16:15 【问题描述】:

我最近一直被我的 d3d11 应用程序启动缓慢所困扰,所以我开始调查并发现罪魁祸首是 D3D11CreateDeviceAndSwapChain。这个单次调用大约需要 1.5 秒。这对我来说似乎很慢。这也是你的经历吗?

这是设置代码:

DXGI_SWAP_CHAIN_DESC swap_chain_desc = ;

swap_chain_desc.BufferDesc.Width = window->window_width;
swap_chain_desc.BufferDesc.Height = window->window_height;
swap_chain_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swap_chain_desc.SampleDesc.Count = 1;
swap_chain_desc.SampleDesc.Quality = 0;
swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swap_chain_desc.BufferCount = 2;
swap_chain_desc.OutputWindow = window->window_handle;
swap_chain_desc.BufferDesc.RefreshRate.Numerator = 60;
swap_chain_desc.BufferDesc.RefreshRate.Denominator = 1;
swap_chain_desc.Windowed = true;
swap_chain_desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;

D3D_FEATURE_LEVEL feature_level = D3D_FEATURE_LEVEL_11_0;
D3D_FEATURE_LEVEL supported_feature_level;

UINT flags = 0;
#ifdef DEBUG
flags = D3D11_CREATE_DEVICE_DEBUG;
#endif

HRESULT hr = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags, &feature_level, 1, D3D11_SDK_VERSION,
                                           &swap_chain_desc, &context.swapChain, &context.device, &supported_feature_level, &context.context);

【问题讨论】:

D3D11CreateDeviceAndSwapChain 有点老派。现代最佳实践是独立创建设备和交换链。这也可能让您缩小流程的哪一部分花费时间。看看Anatomy of Direct3D 11 Create Device。 感谢您的建议,我试过了,似乎对 D3D11CreateDevice 的调用占用了大部分时间。 如果不使用D3D11_CREATE_DEVICE_DEBUG,会不会更快? 好像没有。 尝试使用上述博客文章中的模式ID3D11Device -> IDXGIDevice -> IDXGIAdapter 并转储您从adaper->GetDesc 获得的内容(即VendorId、@987654330 @、Description)。可能会告诉您更多有关实际返回的设备的信息。 【参考方案1】:

首先,您应该考虑不推荐使用D3D11CreateDeviceAndSwapChain,设备应该单独创建,并且您可以根据您的应用程序创建一些交换链变体(例如 hwnd 与核心窗口)。

设备创建速度慢没有任何理由,但过去设备创建速度慢的经验是由于来自 Steam 等应用程序的 d3d 挂钩。最简单的确认方法是对您的初始化进行分析捕获,并查看所涉及的调用堆栈和 DLL,即设备创建的子级。

【讨论】:

感谢您的建议。我尝试调用D3D11CreateDevice,但正如我在原始帖子下方的 cmets 中提到的那样,它根本没有帮助。我尝试分析,似乎对 nvwgf2umx.dll 的调用占用了大量时间 - 快速谷歌搜索显示这确实是 d3d11 驱动程序,所以我想这里没有任何可疑之处。

以上是关于D3D11CreateDeviceAndSwapChain 慢的主要内容,如果未能解决你的问题,请参考以下文章

使用 D3D11CreateDeviceAndSwapChain?

D3D11:从 6 个图像创建立方体贴图

D3D11CreateDeviceAndSwapChain 未解决的外部

D3D11:如何将 GDI 文本绘制到 GXDI 表面? (没有 D2D)

在 D3D11 中将纹理预加载到 GPU 内存

D3D11笔记——Resource基本概念