Partager via


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

Vous pouvez accéder directement à la mémoire de surface à l’aide de la méthode IDirect3DSurface9::LockRect . Lorsque vous appelez cette méthode, le paramètre pRect est un pointeur vers une structure RECT qui décrit le rectangle sur la surface à accéder directement. Pour demander que la surface entière soit verrouillée, définissez pRect sur 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’une mémoire tampon d’arrière-échantillonnage multiple ne peut pas être verrouillée.

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

Lorsque vous disposez d’une surface verrouillée, vous pouvez manipuler directement le 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 supposez jamais une hauteur d’affichage constante. Examinez toujours les informations de tangage retournées par la méthode IDirect3DSurface9::LockRect . Cette hauteur peut varier pour un certain nombre de raisons, notamment l’emplacement de la mémoire de surface, le type d’affichage carte ou même la version du pilote Direct3D. Pour plus d’informations, consultez Largeur et hauteur (Direct3D 9).
  • Veillez à copier sur des 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 pendant qu’une surface est verrouillée.
  • Copiez toujours 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 à trame plate virtuelle pour les cartes d’affichage avec une mémoire basculée. Le gestionnaire permet à ces périphériques d’affichage de présenter une mémoire tampon de trame linéaire à Direct3D. La copie de données non alignées pour afficher la mémoire peut entraîner la suspension des opérations par le système si la copie s’étend sur des banques de mémoire.
  • Une surface ne peut pas être verrouillée si elle appartient à une ressource affectée au pool de mémoire D3DPOOL_DEFAULT, 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 arrière, accessibles à l’aide des méthodes IDirect3DDevice9::GetBackBuffer et IDirect3DSwapChain9::GetBackBuffer , peuvent être verrouillées uniquement si la chaîne d’échange a été créée avec le membre Flags de D3DPRESENT_PARAMETERS pour inclure D3DPRESENTFLAG_LOCKABLE_BACKBUFFER.

Direct3D Surfaces