2017-07-19 2 views
0

J'ai récemment été dérangé par un démarrage lent de mon application d3d11, donc j'ai commencé à enquêter et j'ai trouvé que le coupable est D3D11CreateDeviceAndSwapChain. Cet appel unique prend environ 1,5 secondes. Cela semble fou lent pour moi. Est-ce aussi votre expérience?D3D11CreateDeviceAndSwapChain lent

Ceci est le code d'installation:

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'' est un peu old-school. La meilleure pratique moderne est de créer l'appareil et swapchain indépendamment. Cela pourrait également vous permettre de réduire la partie du processus prend le temps. Jetez un oeil à [Anatomie de Direct3D 11 Créer un périphérique] (https://blogs.msdn.microsoft.com/chuckw/2014/02/05/ anatomie-de-direct3d-11-create-device /). –

+0

Merci pour suggestion, je l'ai essayé et il semble que l'appel à D3D11CreateDevice prend la majorité du temps. – user1760770

+0

Si vous ne le faites pas avec '' D3D11_CREATE_DEVICE_DEBUG'', est-ce que c'est plus rapide? –

Répondre

0

D'abord, vous devriez envisager D3D11CreateDeviceAndSwapChain dépréciée, l'appareil doit être de créer séparément, et vous avez quelques variantes de la création de la chaîne d'échange basée sur ce que votre demande est (hwnd vs fenêtre de base pour ex).

Il n'y a aucune justification à la création d'un périphérique lent, mais à l'expérience passée avec la création d'un périphérique lent en raison de l'accrochage d3d d'une application telle que Steam. Le moyen le plus simple de confirmer est de prendre une capture de profilage de votre initialisation et de regarder les callstacks et les DLL impliqués, enfants de la création du périphérique.

+0

Merci pour la suggestion. J'ai essayé d'appeler 'D3D11CreateDevice' à la place, mais comme je l'ai mentionné dans les commentaires juste en dessous de mon message original, cela n'aide pas du tout. J'ai essayé le profilage, et il semble que les appels à nvwgf2umx.dll prennent l'énorme morceau de temps - rapide recherche google a révélé que c'est en effet pilote d3d11, donc je suppose que rien de suspect se passe ici. – user1760770