Compartir a través de


Voltear superficies (Direct3D 9)

Normalmente, una aplicación de Direct3D muestra una secuencia animada generando los fotogramas de la animación en búferes de reserva y presentándolos en secuencia. Los búferes de reserva se organizan en cadenas de intercambio. Una cadena de intercambio es una serie de búferes que "voltean" a la pantalla una después de otra. Esto se puede usar para representar una escena en la memoria y, a continuación, voltear la escena a la pantalla cuando se complete la representación. Esto evita el fenómeno conocido como desgarro y permite una animación más suave.

Cada dispositivo creado en Direct3D tiene al menos una cadena de intercambio. Al inicializar el primer dispositivo Direct3D, establece el miembro BackBufferCount de D3DPRESENT_PARAMETERS, que indica a Direct3D el número de búferes de reserva que estarán en la cadena de intercambio. La llamada a IDirect3D9::CreateDevice crea el dispositivo Direct3D y la cadena de intercambio correspondiente.

Cuando se usa IDirect3DDevice9::P resent para solicitar una operación de volteo de superficie, se intercambian los punteros a la memoria expuesta para el búfer frontal y los búferes de reserva. El volteo se realiza mediante el cambio de punteros que el dispositivo de visualización usa para hacer referencia a la memoria, no copiando la memoria expuesta. Cuando una cadena de volteo contiene un búfer frontal y más de un búfer de reserva, los punteros se cambian en un patrón circular, como se muestra en el diagrama siguiente.

diagrama de una cadena de volteo con un búfer frontal y dos búferes de reserva

Puedes crear cadenas de intercambio adicionales para un dispositivo llamando a IDirect3DDevice9::CreateAdditionalSwapChain. Una aplicación puede crear una cadena de intercambio por vista y asociar cada cadena de intercambio con una ventana determinada. La aplicación representa imágenes en los búferes de reserva de cada cadena de intercambio y, a continuación, las presenta individualmente. Los dos parámetros que toma IDirect3DDevice9::CreateAdditionalSwapChain son un puntero a una estructura D3DPRESENT_PARAMETERS y la dirección de un puntero a una interfaz IDirect3DSwapChain9 . A continuación, puede usar IDirect3DSwapChain9::P resent para mostrar el contenido del siguiente búfer de reserva en el búfer frontal. Tenga en cuenta que un dispositivo solo puede tener una cadena de intercambio de pantalla completa.

Puede obtener acceso a un búfer de reserva específico llamando a los métodos IDirect3DDevice9::GetBackBuffer o IDirect3DSwapChain9::GetBackBuffer , que devuelven un puntero a una interfaz IDirect3DSurface9 que representa la superficie de búfer de reserva devuelta. Tenga en cuenta que llamar a este método aumenta el recuento de referencias internas en la interfaz IDirect3DDevice9 , así que asegúrese de llamar a IUnknown cuando haya terminado de usar esta superficie o tendrá una pérdida de memoria.

Recuerde que Direct3D voltea las superficies intercambiando punteros de memoria de superficie dentro de la cadena de intercambio, no intercambiando las propias superficies. Esto significa que siempre se representará en el búfer de reserva que se mostrará a continuación.

Es importante tener en cuenta la distinción entre una "operación de volteo", como lo realiza un controlador de adaptador de pantalla, y una operación "Present" aplicada a una cadena de intercambio creada con D3DSWAPEFFECT_FLIP.

El término "voltear" denota convencionalmente una operación que modifica el intervalo de direcciones de memoria de vídeo que usa un adaptador de pantalla para generar su señal de salida, lo que hace que se muestre el contenido de un búfer de reserva oculto anteriormente. En Direct3D 9, el término se usa con más frecuencia para describir la presentación de un búfer de reserva en cualquier cadena de intercambio creada con el efecto de intercambio D3DSWAPEFFECT_FLIP.

Aunque estas operaciones "presentes" se implementan casi invariablemente mediante operaciones de volteo cuando la cadena de intercambio es una de pantalla completa, se implementan necesariamente mediante operaciones de copia cuando se abre la cadena de intercambio. Además, un controlador de adaptador de pantalla puede usar el volteo para implementar operaciones presentes en cadenas de intercambio de pantalla completa basadas en el D3DSWAPEFFECT_DISCARD y la D3DSWAPEFFECT_COPY.

La explicación anterior se aplica al caso de uso común de una cadena de intercambio de pantalla completa creada con D3DSWAPEFFECT_FLIP.

Para obtener una explicación más general de los diferentes efectos de intercambio para cadenas de intercambio en ventanas y de pantalla completa, consulte D3DSWAPEFFECT.

Superficies de Direct3D