Retourner des surfaces (Direct3D 9)

Une application Direct3D affiche généralement une séquence animée en générant les images de l’animation dans les mémoires tampons arrière et en les présentant en séquence. Les mémoires tampons arrière sont organisées en chaînes d’échange. Une chaîne d’échange est une série de mémoires tampons qui « basculent » l’un après l’autre vers l’écran. Cela peut être utilisé pour restituer une scène en mémoire, puis retourner la scène à l’écran une fois le rendu terminé. Cela évite le phénomène connu sous le nom de déchirement et permet une animation plus fluide.

Chaque appareil créé dans Direct3D a au moins une chaîne de permutation. Lorsque vous initialisez le premier appareil Direct3D, vous définissez le membre BackBufferCount de D3DPRESENT_PARAMETERS, qui indique à Direct3D le nombre de mémoires tampons arrière qui seront dans la chaîne d’échange. L’appel à IDirect3D9::CreateDevice crée ensuite l’appareil Direct3D et la chaîne d’échange correspondante.

Lorsque vous utilisez IDirect3DDevice9::P resent pour demander une opération de retournement de surface, les pointeurs vers la mémoire de surface pour les mémoires tampons avant et arrière sont échangés. Le basculement s’effectue en changeant les pointeurs que le périphérique d’affichage utilise pour référencer la mémoire, et non en copiant la mémoire surface. Lorsqu’une chaîne de basculement contient une mémoire tampon avant et plusieurs mémoires tampons arrière, les pointeurs sont basculés dans un modèle circulaire, comme illustré dans le diagramme suivant.

diagramme d’une chaîne de basculement avec une mémoire tampon avant et deux mémoires tampons arrière

Vous pouvez créer des chaînes d’échange supplémentaires pour un appareil en appelant IDirect3DDevice9::CreateAdditionalSwapChain. Une application peut créer une chaîne d’échange par vue et associer chaque chaîne d’échange à une fenêtre particulière. L’application restitue les images dans les mémoires tampons d’arrière-plan de chaque chaîne d’échange, puis les présente individuellement. Les deux paramètres que prend IDirect3DDevice9::CreateAdditionalSwapChain sont un pointeur vers une structure D3DPRESENT_PARAMETERS et l’adresse d’un pointeur vers une interface IDirect3DSwapChain9 . Vous pouvez ensuite utiliser IDirect3DSwapChain9::P resent pour afficher le contenu de la mémoire tampon arrière suivante à la mémoire tampon avant. Notez qu’un appareil ne peut avoir qu’une seule chaîne de permutation en plein écran.

Vous pouvez accéder à une mémoire tampon principale spécifique en appelant les méthodes IDirect3DDevice9::GetBackBuffer ou IDirect3DSwapChain9::GetBackBuffer , qui retournent un pointeur vers une interface IDirect3DSurface9 qui représente la surface de mémoire tampon arrière retournée. Notez que l’appel de cette méthode augmente le nombre de références internes sur l’interface IDirect3DDevice9 . Veillez donc à appeler IUnknown lorsque vous avez terminé d’utiliser cette surface, sinon vous aurez une fuite de mémoire.

N’oubliez pas que Direct3D retourne des surfaces en permutant les pointeurs de mémoire de surface au sein de la chaîne d’échange, et non en permutant les surfaces elles-mêmes. Cela signifie que vous serez toujours rendu dans la mémoire tampon arrière qui sera affichée ensuite.

Il est important de noter la distinction entre une « opération de basculement » effectuée par un pilote d’adaptateur d’affichage et une opération « Présente » appliquée à une chaîne d’échange créée avec D3DSWAPEFFECT_FLIP.

Le terme « flip » désigne classiquement une opération qui modifie la plage d’adresses de mémoire vidéo qu’une carte d’affichage utilise pour générer son signal de sortie, entraînant ainsi l’affichage du contenu d’une mémoire tampon arrière précédemment masquée. Dans Direct3D 9, le terme est souvent utilisé plus généralement pour décrire la présentation d’une mémoire tampon arrière dans toute chaîne d’échange créée avec l’effet d’échange D3DSWAPEFFECT_FLIP.

Bien que de telles opérations « présentes » soient presque invariablement implémentées par des opérations de retournement lorsque la chaîne d’échange est en plein écran, elles sont nécessairement implémentées par des opérations de copie lorsque la chaîne d’échange est fenêtré. En outre, un pilote d’adaptateur d’affichage peut utiliser le basculement pour implémenter des opérations Présente sur des chaînes d’échange en plein écran basées sur les D3DSWAPEFFECT_DISCARD et les D3DSWAPEFFECT_COPY.

La discussion ci-dessus s’applique au cas couramment utilisé d’une chaîne d’échange en plein écran créée avec D3DSWAPEFFECT_FLIP.

Pour une présentation plus générale des différents effets d’échange pour les chaînes d’échange fenêtrés et plein écran, consultez D3DSWAPEFFECT.

Direct3D Surfaces