Compartir a través de


Enumeración D3DSWAPEFFECT

Define los efectos de intercambio.

Sintaxis

typedef enum D3DSWAPEFFECT { 
  D3DSWAPEFFECT_DISCARD      = 1,
  D3DSWAPEFFECT_FLIP         = 2,
  D3DSWAPEFFECT_COPY         = 3,
  D3DSWAPEFFECT_OVERLAY      = 4,
  D3DSWAPEFFECT_FLIPEX       = 5,
  D3DSWAPEFFECT_FORCE_DWORD  = 0xFFFFFFFF
} D3DSWAPEFFECT, *LPD3DSWAPEFFECT;

Constantes

D3DSWAPEFFECT_DISCARD

Cuando se crea una cadena de intercambio con un efecto de intercambio de D3DSWAPEFFECT_FLIP o D3DSWAPEFFECT_COPY, el tiempo de ejecución garantizará que una operación IDirect3DDevice9::P resent no afectará al contenido de ninguno de los búferes de reserva. Desafortunadamente, cumplir esta garantía puede implicar importantes sobrecargas de procesamiento o memoria de vídeo, especialmente al implementar la semántica de volteo para una cadena de intercambio ventanada o la semántica de copia para una cadena de intercambio de pantalla completa. Una aplicación puede usar el efecto de intercambio de D3DSWAPEFFECT_DISCARD para evitar estas sobrecargas y permitir que el controlador de pantalla seleccione la técnica de presentación más eficaz para la cadena de intercambio. Este es también el único efecto de intercambio que se puede usar al especificar un valor distinto de D3DMULTISAMPLE_NONE para el miembro MultiSampleType de D3DPRESENT_PARAMETERS.

Al igual que una cadena de intercambio que usa D3DSWAPEFFECT_FLIP, una cadena de intercambio que usa D3DSWAPEFFECT_DISCARD puede incluir más de un búfer de reserva, cualquiera de los cuales se puede acceder mediante IDirect3DDevice9::GetBackBuffer o IDirect3DSwapChain9::GetBackBuffer. La cadena de intercambio se prevé mejor como una cola en la que 0 siempre indexa el búfer de reserva que mostrará la siguiente operación Present y desde la que se descartan los búferes cuando se hayan mostrado.

Una aplicación que usa este efecto de intercambio no puede realizar suposiciones sobre el contenido de un búfer de reserva descartado y, por lo tanto, debe actualizar un búfer de reserva completo antes de invocar una operación Present que lo mostraría. Aunque esto no se aplica, la versión de depuración del entorno de ejecución sobrescribirá el contenido de los búferes de reserva descartados con datos aleatorios para permitir a los desarrolladores comprobar que sus aplicaciones actualizan correctamente todas las superficies del búfer de reserva.

D3DSWAPEFFECT_FLIP

La cadena de intercambio puede incluir varios búferes de reserva y se prevé mejor como una cola circular que incluya el búfer frontal. Dentro de esta cola, los búferes de reserva siempre se numeran secuencialmente de 0 a (n - 1), donde n es el número de búferes de reserva, de modo que 0 denota el búfer menos presentado recientemente. Cuando se invoca Present, la cola se "gira" para que el búfer frontal se convierta en búfer de reserva (n - 1), mientras que el búfer de reserva 0 se convierte en el nuevo búfer frontal.

D3DSWAPEFFECT_COPY

Este efecto de intercambio solo se puede especificar para una cadena de intercambio que comprende un único búfer de reserva. Tanto si la cadena de intercambio está ventanada como de pantalla completa, el tiempo de ejecución garantizará la semántica implícita por una operación Present basada en copia, es decir, que la operación deja sin cambios el contenido del búfer de reserva, en lugar de reemplazarlo por el contenido del búfer frontal como una operación Present basada en volteo.

Para una cadena de intercambio de pantalla completa, el tiempo de ejecución usa una combinación de operaciones de volteo y operaciones de copia, compatibles si es necesario con búferes de retroceso ocultos, para realizar la operación Present. En consecuencia, la presentación se sincroniza con el retroceso vertical del adaptador de pantalla y su velocidad está restringida por el intervalo de presentación elegido. Una cadena de intercambio especificada con la marca D3DPRESENT_INTERVAL_IMMEDIATE es la única excepción. (Consulte la descripción del miembro PresentationIntervals de la estructura D3DPRESENT_PARAMETERS ). En este caso, una operación Present copia el contenido del búfer de reserva directamente en el búfer frontal sin esperar al retroceso vertical.

D3DSWAPEFFECT_OVERLAY

Usa un área dedicada de memoria de vídeo que se puede superponer en la superficie principal. No se realiza ninguna copia cuando se muestra la superposición. La operación de superposición se realiza en hardware, sin modificar los datos de la superficie principal.

Diferencias entre Direct3D 9 y Direct3D 9Ex:

  • D3DSWAPEFFECT_OVERLAY solo está disponible en Direct3D9Ex que se ejecuta en Windows 7 (o en un sistema operativo más actual).

D3DSWAPEFFECT_FLIPEX

Designa cuando una aplicación adopta el modo flip, durante el cual se pasa el marco de una aplicación en lugar de copiarse en el Administrador de ventanas de escritorio (DWM) para la composición cuando la aplicación se presenta en modo de ventana. El modo flip permite a una aplicación usar de forma más eficaz el ancho de banda de memoria, así como permitir que una aplicación aproveche las estadísticas presentes en pantalla completa. El modo de volteo no afecta al comportamiento de la pantalla completa.

Nota

Si crea una cadena de intercambio con D3DSWAPEFFECT_FLIPEX, no puede invalidar el miembro hDeviceWindow de la estructura D3DPRESENT_PARAMETERS cuando presente un nuevo marco para su presentación. Es decir, debe pasar NULL al parámetro hDestWindowOverride de IDirect3DDevice9Ex::P resentEx para indicar al runtime que use el miembro hDeviceWindow de D3DPRESENT_PARAMETERS para la presentación.

Diferencias entre Direct3D 9 y Direct3D 9Ex:

  • D3DSWAPEFFECT_FLIPEX solo está disponible en Direct3D9Ex que se ejecuta en Windows 7 (o en un sistema operativo más actual).

D3DSWAPEFFECT_FORCE_DWORD

Obliga a esta enumeración a compilar a 32 bits de tamaño. Sin este valor, algunos compiladores permitirían que esta enumeración se compile en un tamaño distinto de 32 bits. Este valor no se utiliza.

Comentarios

El estado del búfer de reserva después de una llamada a Present está bien definido por cada uno de estos efectos de intercambio y si el dispositivo Direct3D se creó con una cadena de intercambio de pantalla completa o una cadena de intercambio en ventanas no tiene ningún efecto en este estado. En concreto, el efecto de intercambio de D3DSWAPEFFECT_FLIP funciona igual tanto si está en ventana como en pantalla completa, y el tiempo de ejecución de Direct3D garantiza esto mediante la creación de búferes adicionales. Como resultado, se recomienda que las aplicaciones usen D3DSWAPEFFECT_DISCARD siempre que sea posible para evitar tales penalizaciones. Esto se debe a que este efecto de intercambio siempre será el más eficaz en términos de consumo y rendimiento de memoria.

Las aplicaciones que usan D3DSWAPEFFECT_FLIP o D3DSWAPEFFECT_DISCARD no deben esperar que funcione el alfa de destino de pantalla completa. Esto significa que el estado de representación del D3DRS_DESTBLEND no funcionará según lo previsto porque las cadenas de intercambio de pantalla completa con estos efectos de intercambio no tienen un formato de píxel explícito desde el punto de vista del controlador. El controlador deduce que deben tomar el formato de presentación, que no tiene un canal alfa. Para solucionarlo, siga estos pasos:

  • Use D3DSWAPEFFECT_COPY.
  • Compruebe la marca D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD en el miembro Caps3 de la estructura D3DCAPS9 . Esta marca indica si el controlador puede realizar la combinación alfa cuando se usa D3DSWAPEFFECT_FLIP o D3DSWAPEFFECT_DISCARD.
  • Las aplicaciones que usan el efecto de intercambio de modo invertida (D3DSWAPEFFECT_FLIPEX) deben llamar a PresentEx después de cambiar el tamaño de una ventana o región para asegurarse de que el contenido de la pantalla se actualiza.

Una ventana invisible no puede recibir eventos en modo de usuario; además, una ventana de pantalla completa invisible interferirá con la presentación de la ventana en modo ventana de otra aplicación. Por lo tanto, cada aplicación debe asegurarse de que una ventana del dispositivo está visible cuando se presenta una cadena de intercambio en modo de pantalla completa.

Requisitos

Requisito Value
Encabezado
D3D9Types.h

Consulte también

Enumeraciones de Direct3D

IDirect3DDevice9::Reset