Compartir a través de


Acceder directamente a la memoria expuesta (Direct3D 9)

Puede acceder directamente a la memoria expuesta mediante el método IDirect3DSurface9::LockRect . Cuando se llama a este método, el parámetro pRect es un puntero a una estructura RECT que describe el rectángulo en la superficie para acceder directamente. Para solicitar que se bloquee toda la superficie, establezca pRect en NULL. Además, puede especificar un RECT que cubra solo una parte de la superficie. Siempre que no se superpongan dos rectángulos, dos subprocesos o procesos pueden bloquear simultáneamente varios rectángulos en una superficie. Tenga en cuenta que no se puede bloquear un búfer de retroceso de varios ejemplos.

El método IDirect3DSurface9::LockRect rellena una estructura de D3DLOCKED_RECT con toda la información para acceder correctamente a la memoria expuesta. La estructura incluye información sobre el tono y tiene un puntero a los bits bloqueados. Cuando termines de acceder a la memoria expuesta, llama al método IDirect3DSurface9::UnlockRect para desbloquearla.

Aunque tienes una superficie bloqueada, puedes manipular directamente el contenido. En la lista siguiente se describen algunas sugerencias para evitar problemas comunes con la representación directa de la memoria expuesta.

  • Nunca asuma un tono de presentación constante. Examine siempre la información de tono devuelta por el método IDirect3DSurface9::LockRect . Esta inclinación puede variar por varias razones, incluida la ubicación de la memoria de superficie, el tipo de tarjeta de presentación o incluso la versión del controlador Direct3D. Para obtener más información, consulta Ancho frente a tono (Direct3D 9).
  • Asegúrate de copiar en superficies desbloqueadas. Se producirá un error en los métodos de copia de Direct3D si se llama a en una superficie bloqueada.
  • Limite la actividad de la aplicación mientras una superficie está bloqueada.
  • Copie siempre los datos alineados para mostrar la memoria. Windows 98 usa un controlador de errores de página, Vflatd.386, para implementar un búfer de marco plano virtual para tarjetas de visualización con memoria conmutada por banco. El controlador permite que estos dispositivos de visualización presenten un búfer de fotogramas lineal a Direct3D. Copiar datos no asignados para mostrar la memoria puede hacer que el sistema suspenda las operaciones si la copia abarca los bancos de memoria.
  • Es posible que una superficie no esté bloqueada si pertenece a un recurso asignado al grupo de memoria D3DPOOL_DEFAULT a menos que sea una textura dinámica o una superficie creada con IDirect3DDevice9::CreateOffscreenPlainSurface. Las superficies de búfer de reserva, a las que se puede acceder mediante los métodos IDirect3DDevice9::GetBackBuffer e IDirect3DSwapChain9::GetBackBuffer , solo se pueden bloquear si la cadena de intercambio se creó con el miembro Flags de D3DPRESENT_PARAMETERS para incluir D3DPRESENTFLAG_LOCKABLE_BACKBUFFER.

Superficies de Direct3D