2017-07-19 17 views
0

私は最近d3d11アプリケーションの起動が遅いので、調査を開始し、原因がD3D11CreateDeviceAndSwapChainであることがわかりました。この単一の呼び出しには、およそ1.5秒かかります。それは私にとっては狂っているようだ。これもあなたの経験ですか?D3D11CreateDeviceAndSwapChain slow

これは、セットアップコードです:あなたは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''はちょっと古い学校です。現代のベストプラクティスは、デバイスを作成し、独立して交換することです。これにより、プロセスのどの部分が時間を費やしているかを絞り込むこともできます。[Direct3D 11デバイスの作成](https://blogs.msdn.microsoft.com/chuckw/2014/02/05/)を参照してください。 direct3d-11-create-device /の解剖学) –

+0

提案してくれてありがとう、私はそれを試みたとD3D11CreateDeviceの呼び出しが大部分の時間かかるようです。 – user1760770

+0

'' D3D11_CREATE_DEVICE_DEBUG''でそれをしないと、それはもっと速いのですか? –

答えて

0

まず、あなたは、アプリケーションが(HWNDが何であるかに基づいてスワップチェーンの作成のいくつかのバリエーションを持っていますex対コアウィンドウ。

デバイスの作成が遅いという正当な理由はありませんが、スチームのようなアプリケーションからのd3dフックが原因でデバイスが遅く作成された経験があります。確認する最も簡単な方法は、初期化のプロファイリングキャプチャを行い、関連するコールスタックとDLL(デバイス作成の子)を調べることです。

+0

提案をありがとう。私は代わりに 'D3D11CreateDevice'を呼び出そうとしましたが、私の元の投稿のすぐ下のコメントで言及したように、それはまったく役に立ちません。私はプロファイリングを試みました、そして、それはnvwgf2umx.dllへの呼び出しが時間の巨大なチャンクをとるように思われます - これは確かにd3d11ドライバであることがわかったので、ここでは何も起こっていないと思います。 – user1760770