Accès direct à la mémoire de surface (Direct3D 9)

Vous pouvez accéder directement à la mémoire de surface à l’aide de la méthode IDirect3DSurface9 :: LockRect . Quand vous appelez cette méthode, le paramètre pRect est un pointeur vers une structure Rect qui décrit le rectangle sur la surface auquel accéder directement. Pour demander que la surface entière soit verrouillée, affectez à pRect la valeur null. En outre, vous pouvez spécifier un Rect qui couvre uniquement une partie de la surface. Si deux rectangles ne se chevauchent pas, deux threads ou processus peuvent verrouiller simultanément plusieurs rectangles dans une surface. Notez qu’un tampon d’arrière-plan à échantillonnage ne peut pas être verrouillé.

La méthode IDirect3DSurface9 :: LockRect remplit une structure _ Rect D3DLOCKED avec toutes les informations pour accéder correctement à la mémoire de l’aire. La structure inclut des informations sur le pas à pas et a un pointeur vers les bits verrouillés. Lorsque vous avez terminé d’accéder à la mémoire d’exposition, appelez la méthode IDirect3DSurface9 :: UnlockRect pour la déverrouiller.

Si une surface est verrouillée, vous pouvez manipuler directement son contenu. La liste suivante décrit quelques conseils pour éviter les problèmes courants liés au rendu direct de la mémoire de surface.

  • Ne jamais supposer une tonalité d’affichage constante. Examinez toujours les informations de pas retournées par la méthode IDirect3DSurface9 :: LockRect . Ce pas à pas peut varier pour plusieurs raisons, notamment l’emplacement de la mémoire d’exposition, le type de carte d’affichage ou même la version du pilote Direct3D. Pour plus d’informations, consultez largeur et tangage (Direct3D 9).
  • Veillez à copier les surfaces déverrouillées. Les méthodes de copie Direct3D échouent si elles sont appelées sur une surface verrouillée.
  • Limitez l’activité de votre application lorsqu’une surface est verrouillée.
  • Toujours copier les données alignées pour afficher la mémoire. Windows 98 utilise un gestionnaire d’erreurs de page, Vflatd. 386, pour implémenter une mémoire tampon d’image plate virtuelle pour les cartes d’affichage avec mémoire commutée. Le gestionnaire permet à ces appareils d’affichage de présenter une mémoire tampon de trame linéaire à Direct3D. La copie de données non alignées sur la mémoire d’affichage peut entraîner l’interruption des opérations par le système si la copie s’étend sur des banques de mémoire.
  • Une surface peut ne pas être verrouillée si elle appartient à une ressource affectée au _ pool de mémoire D3DPOOL par défaut, sauf s’il s’agit d’une texture dynamique ou d’une surface créée à l’aide de IDirect3DDevice9 :: CreateOffscreenPlainSurface. Les surfaces de mémoire tampon d’arrière-plan, accessibles à l’aide des méthodes IDirect3DDevice9 :: GetBackBuffer et IDirect3DSwapChain9 :: GetBackBuffer , peuvent être verrouillées uniquement si la chaîne de permutation a été créée avec le membre Flags des _ paramètres D3DPRESENT pour inclure la mémoire tampon d’arrière-plan D3DPRESENTFLAG _ verrouillable _ .

Surfaces Direct3D