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?
D3D11CreateDeviceAndSwapChain 未解决的外部