Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les chaînes d’échange contrôlent la rotation de la mémoire tampon arrière, formant la base de l’animation graphique.
Aperçu
Le modèle de programmation pour les chaînes d’échange dans Direct3D 12 n’est pas identique à celui dans les versions antérieures de D3D. La commodité de programmation, par exemple, de la prise en charge de la rotation automatique des ressources présentes dans D3D10 et D3D11 n’est plus prise en charge. La rotation automatique des ressources permet aux applications d’afficher le même objet API pendant que la surface réelle affichée modifie chaque image. Le comportement des chaînes d’échange est modifié avec Direct3D 12 pour permettre à d’autres fonctionnalités de Direct3D 12 d’avoir une faible surcharge processeur. La clé de couleur automatique et le multi-échantillonnage ne sont pas pris en charge, bien que, notamment, l'étirement et la rotation le soient toujours.
Durée de vie de la mémoire tampon
Les applications sont autorisées à stocker des descripteurs précréés qui référencent les mémoires tampons d'arrière-plan. Cela est activé en garantissant que l’ensemble de mémoires tampons détenues par une chaîne d’échange ne change jamais pour la durée de vie de la chaîne d’échange. L’ensemble de mémoires tampons retournées par IDXGISwapChain ::GetBuffer ne change pas tant que certaines API ne sont pas appelées :
L’ordre des mémoires tampons retournées par GetBuffer ne change jamais.
IDXGISwapChain3 ::GetCurrentBackBufferIndex retourne l’index de la mémoire tampon back actuelle à l’application.
Effets d’échange
Les seuls effets d’échange pris en charge sont DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL et DXGI_SWAP_EFFECT_FLIP_DISCARD, ce qui nécessite que le nombre de mémoires tampons soit supérieur à un.
Tip
Pour les jeux ciblant une latence d’entrée minimale, créez la chaîne d’échange avec DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING, puis appelez Present(0, DXGI_PRESENT_ALLOW_TEARING). Cela contourne la synchronisation vsync du compositeur et offre la plus faible latence entre la présentation et l’affichage. Au moment de l'exécution, vérifiez la prise en charge du tearing en appelant IDXGIFactory5::CheckFeatureSupport avec DXGI_FEATURE_PRESENT_ALLOW_TEARING avant d'utiliser cette méthode.
Avertissement
Un bug courant de cadencement des images consiste à appeler Present(1, 0) (VSync activée) sans synchroniser correctement le travail du processeur avec la clôture du processeur graphique. Le processeur prend alors de l'avance, ce qui crée une file d'attente d'images et augmente la latence d'entrée. Utilisez toujours une clôture basée sur le nombre d'images pour limiter le nombre d'images du processeur en cours de traitement (généralement au nombre de mémoires tampons moins une).
Transition entre les modes fenêtres et plein écran
Direct3D 12 ne prend pas en charge le mode exclusif plein écran (FSE). Au lieu de cela, lorsqu’un jeu est la seule application visible à l’écran, le système d’exploitation utilise une stratégie appelée optimisations en plein écran (FSO) pour obtenir un effet similaire à CELUI-ci sans les inconvénients des performances. Pour plus d'informations sur les optimisations plein écran, consultez Démystification des optimisations plein écran.
Direct3D 12 maintient la restriction que les applications doivent appeler ResizeBuffers après la transition entre les modes fenêtres et plein écran (les chaînes d’échange de modèle inversé D3D11 ont les mêmes restrictions).
Les transitions IDXGISwapChain ::SetFullscreenState ne modifient pas l’ensemble de mémoires tampons visibles par l’application dans la chaîne d’échange. Seuls les appels ResizeBuffers et ResizeTarget créent ou détruisent des mémoires tampons visibles par l’application. Toutefois, dans Direct3D 12 IDXGISwapChain ::SetFullscreenState n’entre pas en mode exclusif plein écran, il modifie simplement les résolutions et les taux d’actualisation pour autoriser les optimisations en plein écran. Ces modifications peuvent être apportées par une application sans utiliser cette méthode
Lorsque IDXGISwapChain::Present ou IDXGISwapChain1::Present est appelé, la mémoire tampon d'arrière-plan à présenter doit être dans l'état D3D12_RESOURCE_STATE_PRESENT. Present échoue avec DXGI_ERROR_INVALID_CALL si ce n'est pas le cas.
Les chaînes d’échange plein écran continuent d’avoir la restriction que SetFullscreenState(FALSE, NULL) doit être appelée avant la version finale de la chaîne d’échange. SetFullscreenState(FALSE) réussit sur les chaînes d’échange fonctionnant sur les périphériques Direct3D 12.
Les opérations présentes se produisent sur la file d’attente 3D fournie lors de la création de la chaîne d’échange, et les applications sont libres de présenter simultanément plusieurs chaînes d’échange, d’enregistrer et d’exécuter des listes de commandes.
Lorsque la dernière partie du travail graphique (par exemple, le post-traitement d’images) est effectuée sur une file d’attente de calcul ou n’implique pas la file d’attente graphique de l’appareil, la création d’une deuxième file d’attente 3D à présenter peut être bénéfique et empêcher la latence de la présentation retardant le début de l’image suivante.
Example
L’exemple de code suivant est présent dans la boucle de rendu principale :
Avertissement
L’exemple ci-dessous est simplifié pour plus de clarté. Une boucle de jeu destinée à la production doit dissocier les mises à jour de la simulation de la fréquence de rendu, par exemple en utilisant un pas de temps fixe pour la simulation tout en effectuant le rendu aussi rapidement que possible, et utiliser une clôture pour limiter le nombre d'images en cours de traitement. Sans limitation du nombre d'images en cours de traitement, Present peut réussir immédiatement sur les chaînes de permutation de modèle flip, ce qui permet au processeur de mettre en file d'attente un nombre illimité d'images et augmente la latence d'entrée.
void Present()
{
m_swapChain->Present(0, m_presentFlags);
m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}
Création de chaînes d’échange
Lors de l’utilisation des appels CreateSwapChainForHwnd, CreateSwapChainForCoreWindow ou CreateSwapChainForComposition , notez que le paramètre pDevice nécessite réellement un pointeur vers une file d’attente de commandes directe dans Direct3D 12 et non un appareil.
Présentation sur Windows 7
Lorsque vous ciblez Direct3D 12 sur Windows 7, les types DXGI nécessaires pour Direct3D 12 ne sont pas présents. Vous devez donc utiliser le ID3D12CommandQueueDownLevel fourni par D3D12On7 (obtenu de la file d'attente de commandes directe) pour présenter.
Vous fournissez une liste de commandes ouverte à la méthode actuelle de Windows 7, qui sera ensuite utilisée, fermée et automatiquement envoyée à l’appareil pour vous. Vous devez fournir une mémoire tampon d'arrière-plan qui doit être créée par l'application, être une ressource validée, utiliser un seul échantillon et être dans l'un des formats suivants.
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8X8_UNORM
- DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB