2017-07-19 47 views
0

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

这是设置代码:

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); 
+1

''D3D11CreateDeviceAndSwapChain''是有点老派。现代最佳实践是独立创建设备和交换链。这也可能让你缩小一下过程的一部分走的是time.Take看看[Direct3D的11剖析创建设备(https://blogs.msdn.microsoft.com/chuckw/2014/02/05/解剖的-Direct3D的11创建设备/)。 –

+0

感谢您的建议,我试过了,似乎D3D11CreateDevice的调用占用了大部分时间。 – user1760770

+0

如果你不用''D3D11_CREATE_DEVICE_DEBUG''来做,它会更快吗? –

回答

0

首先,你应该考虑D3D11CreateDeviceAndSwapChain过时,该设备应单独创建的,你必须根据你的应用是什么样的交换链创建的几个变种(HWND vs ex的核心窗口)。

没有任何理由为慢速设备创建,但过去的经验与慢速设备创建其中由于D3D从应用像蒸汽挂钩。确认最简单的方法是对初始化进行分析捕获,并查看涉及的调用堆栈和DLL,这是设备创建的子节点。

+0

感谢您的建议。我尝试调用'D3D11CreateDevice',但正如我在原始文章下面的评论中所提到的那样,它根本没有任何帮助。我试图分析,似乎打电话给nvwgf2umx.dll采取了大量的时间 - 快速谷歌搜索显示,这确实是d3d11驱动程序,所以我想这里没有任何可疑的事情发生。 – user1760770