| Artículos | 01 JUL 2000

Trabajo con superficies

Tags: Histórico
Introducción a DirectDraw (III)
Francisco Charte.
La composición de escenas y animaciones con DirectDraw se efectúa mediante la definición e intercambio de superficies. En esta entrega veremos cómo crear, manipular y visualizar superficies.

La composición de escenas animadas, típicas de la mayoría de los juegos más atractivos, representa un desafío para los programadores. Dichas escenas suelen contar con un fondo, más o menos complejo, sobre el que se desplazan personajes, naves y otros elementos conocidos genéricamente como sprites. El fondo suele ser de grandes dimensiones, de tal forma que al mover los personajes éstos se desplazan sobre él y, al tiempo, el propio fondo también es desplazado cambiando el área visible en cada momento en la pantalla. Es el típico efecto conocido como scrolling.
Para que el efecto sea óptimo, el dibujado del fondo, que puede estar compuesto de varias capas, y la disposición de los sprites sobre él debe efectuarse con suficiente rapidez. Esta composición, que da lugar a una escena o cuadro de visualización, se repite constantemente a medida que los personajes se mueven o el fondo cambia. El número de cuadros por segundo determinará que la animación sea más o menos realista, aunque en esto también influyen otros factores.

Acceso a la memoria de vídeo
Las imágenes que aparecen en pantalla son un reflejo del contenido de una cierta porción de memoria del adaptador de vídeo. Basta, por tanto, con cambiar dicho contenido para alterar los elementos visibles en pantalla. El acceso directo a la memoria del adaptador de vídeo es el método más rápido para dibujar en pantalla, pero también es uno de los más complejos. Si no se hace adecuadamente, pueden producirse diversos efectos no deseables; desde el parpadeo, si se accede a dicha memoria mientras hay en curso un retrazo del barrido en pantalla, hasta la aparición no sincronizada de los sprites, cuando no se hace el trabajo con la suficiente velocidad.
Para evitar todos esos problemas, es una práctica común componer las escenas o cuadros en una superficie que tiene las mismas dimensiones y atributos que la pantalla visible pero permanece oculta hasta que ha terminado el trabajo sobre ella. En ese preciso instante, con un cuadro completo preparado, se intercambia la superficie visible por la que estaba oculta en un solo paso. De esta forma, se evitan problemas como los descritos.
De lo anterior cabe deducir que, por regla general, trabajaremos con al menos dos superficies: una visible y otra oculta. La primera, como su nombre indica, será la que vea el usuario de la aplicación en cada momento, mientras que la segunda será la superficie de trabajo de nuestro programa. El intercambio periódico de superficies alterará su rol, de tal forma que la visible pasará a ser la de trabajo y viceversa.
Además de las dos superficies mencionadas, habitualmente usaremos otras para almacenar distintos elementos: el fondo o fondos, los diferentes elementos que actuarán como sprites, etc. Usaremos estas superficies, de dimensiones no necesariamente iguales a la de la superficie visible, para componer las escenas en la superficie no visible, efectuando para ello operaciones de copia entre superficies. Dicha copia será muy rápida y eficiente si todas las superficies están almacenadas en la memoria del adaptador de vídeo.
De la memoria que tenga el adaptador de vídeo y de la memoria necesaria para almacenar todas las superficies dependerá que haya que recurrir a la memoria principal del sistema para almacenar algunas de ellas. Si esto ocurre, el rendimiento se verá afectado negativamente, puesto que esas superficies deberán transferirse desde la memoria principal a la del adaptador de vídeo usando el bus del sistema. Si todas las superficies están en la memoria del adaptador de vídeo, por el contrario, las operaciones serán rápidas y podrán, en muchos casos, efectuarse de manera concurrente con otras operaciones que tenga que ejecutar el microprocesador del ordenador en ese momento.

Una técnica muy probada
La animación basada en el intercambio rápido de imágenes con pequeñas diferencias entre ellas no es precisamente algo nuevo; es la base de las primeras animaciones de dibujos y se utiliza por las características particulares de la visión humana. Si nunca lo ha hecho, pruebe a tomar un buen número de páginas en blanco de pequeño tamaño, dibuje en la primera de ellas una figura cualquiera y, a continuación, repítala en la página siguiente con un pequeño cambio. Tras hacer esto en todas las páginas, al pasar de la primera a la última con cierta rapidez tendrá la sensación de que la figura se mueve.
En el trabajo con un ordenador, las páginas en blanco serán las superficies de dibujo que, intercambiadas en una secuencia ordenada, darán lugar al efecto de animación. En la Figura 1 se ha esquematizado el proceso central de una aplicación que usa DirectDraw. La composición de la escena, combinando los fondos y los sprites, se efectúa en una superficie oculta alojada en la memoria del adaptador de vídeo. Cuando la escena está terminada, se hace visible con una simple operación de intercambio. Ésta se caracteriza por ser instantánea, ya que se usan las características hardware del adaptador de gráficos para efectuarla. En ese momento, la escena es visible y el proceso se repite nuevamente.
En la práctica, una aplicación puede utilizar un hilo de ejecución independiente para componer las escenas e intercambiar las superficies, de tal forma que este trabajo no afecte negativamente al tiempo de respuesta del programa a las acciones del usuario, que podrían procesarse en otro hilo concurrente.
Aunque en la representación de la Figura 1 y los comentarios anteriores estamos asumiendo la existencia de una sola superficie oculta, lo cierto es que pueden crearse múltiples superficies de este tipo. Todo depende de la complejidad de las escenas y la velocidad a la que haya que componerlas, siendo posible mantener dos, tres o más superficies ocultas que irían intercambiándose en secuencia con la superficie visible.

Creación de superficies
Asumamos que, siguiendo los pasos descritos en la entrega anterior, hemos inicializado DirectDraw, hemos establecido el nivel de cooperación y hemos fijado el modo en el que vamos a trabajar. El siguiente paso lógico será la creación de las superficies de trabajo necesarias. Como ya puede deducirse de las explicaciones de los dos puntos anteriores, está claro que existirá al menos una superficie: la visible. En la práctica, a menos que pensemos dibujar directamente en dicha superficie, también existirá otra que actuará como superficie no visible.
Para crear una superficie, el primer paso que hay que dar es definir una estructura DDSURFACEDESC2, asignando a sus miembros los datos necesarios para indicar el tipo de superficie y sus características. Acto seguido, completaremos la creación facilitando esa estructura como parámetro al método CreateSurface() de la interfaz IDirectDraw7. Este método, que puede ser utilizado para crear una o más superficies con una sola llamada, retorna un puntero a interfaz IDirectDrawSurface7, mediante la cual podrá manipularse la superficie creada.
La estructura DDSURFACEDESC2 cuenta con un importante número de miembros, aunque no todos ellos han de establecerse en todos los casos. Siempre deberemos asignar valor, no obstante, al miemb

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información