|
||||||||||||||||||||
|
|
DirectX es una API creada por Microsoft, para permitir a los
desarrolladores de juegos programar eficientemente bajo Windows, lo cúal
era improbable antes de la llegada de DirectX, ya que tecnologías como
GDI no permitían acceder al hardware tan directamente como lo hace
DirectX.
Componentes de DirectX DirectX y COM El modelo de objetos componentes proporciona el sostén para el desarrollo de software basado en componentes. Si bien la utilización de COM podría implicar un tutorial propio, para crear una aplicación con DirectX solamente se necesita saber cómo utilizar la función básica de COM. COM es un estándar que define cómo los objetos actúan unos con otros. Específicamente un objeto COM proporciona acceso a su función a través de una o más interfaces. La implementación COM con DirectX, es bastante simple, para considerar que se cumple con COM, un objeto debe heredar sus interfaces del antecesor de todas las interfaces COM:IUknown. Como mínimo, la interfaz debe aplicar los métodos IUnknown, AddRef, Release, QueryInterface. Estos tres métodos controlan el ciclo de vida de un objeto y proporcionan acceso al objeto mediante sus interfaces.
DirectDraw DirectDraw es la parte más importante de la API de DirectX, otros componentes como Direct3D están basados en DirectDraw. Como hemos dicho antes, a través de DirectDraw podemos acceder a zonas de memoria hasta ahora inaccesibles para los de programadores windows.
Esquema de DirectDraw
La capa de asbtracción de Hardware (HAL) DirectDraw consulta a la HAL para determinat el tipo de hardware existente en el sistema. Cuando se crea un objeto DirectDraw, DirectDraw consulta a la HAL para obtener información que se usa para rellenar una tabla de capacidades o prestaciones de Hardware. Algunas de las informaciones que guarda la HAL son: donde comienza la memoria, de video, sus registros y el color de sistema. La capa de emulación de hardware (HEL) Digámoslo así, cuando nuestra computadora no tiene ciertas capacidades de hardware (Acelerador 3D por ejemplo) HEL emula dichas capacidades vía software. Usar DirectDraw Cuando se trabaja con Direct Draw, lo primero que se debe hacer es crear un objeto DirectDraw. Ese objeto proporciona los métodos para crear y gestionar otros objetos, que nos permitirán trabajar con las superficies, paletas, obtener la información del sistema, etc. Cuando se crea un objeto Direct Draw, se crea para un dispositivo DirectDraw concreto corresponde al HAL instalado en el sistema. Crear un objeto DirectDraw Este código muestra como instanciar un objeto DirectDraw, utilizando la función DirectDrawCreate que contiene 3 parámetros. Parámetro 1: El primer parámetro toma un único identificar (GUID) que representa el dispositivo de display. En este caso el valor será NULL, lo que significa que DirectDraw usará el driver por defecto del sistema. Parámetro 2: Identifíca la dirección del puntero en donde Objeto fué creado. Parámetro 3: El tercer parámetro debe ser seteado como NULL. if
( FAILED( DirectDrawCreate( NULL, &lpDD, NULL ) ) ) Configurar el nivel cooperativo El nivel cooperativo especifíca cómo la aplicación interactuará con el sistema (A pantalla completa, en una ventana, etc), mediante la funcióm SetCooperativeLevel. Si estamos programando un juego, seguramente vamos a configurar la aplicación a pantalla completa. if
( FAILED( lpDD->SetCooperativeLevel ( hwnd, DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN ) ) Configurar el modo de video El modo de video, configura el ancho, el alto, y la profundidad de colores. if
( FAILED( lpDD->SetDisplayMode ( 640, 480, 16 ) ) ) Bueno, hasta ahora no hicimos mucho, sólo creamos un objeto DirectDraw, seteamos el nivel cooperativo y el modo de video, claro está que todo esto sólo tiene sentido cuando esté todo el código completo. Superficies Las superficies son el tema central en DirectDraw, en resumen, las superficies son bloques de memoria, que DirectDraw trata como rectángulos, estos bloques de memoria son los que contendrán los gráficos que necesitamos mostrar en la aplicación. El ejemplo más sencillo de superficies, es cuando queremos mostrar una imagen cualquiera, supongamos, foto.bmp, lo primero que hace DirectDraw es crear una superficie y después cargar la imagen en esa superficie. Tipos de Superficie Superficie Primaria o Buffer Frontal: Es la superficie visible por el usuario, cada objeto DirectDraw sólo puede tener un superficie primaria, la cúal es configurada cuando seteamos el modo de video. Superficies no Visibles o Buffer Posterior: Como pueden imaginarse, estas superficies no son visibles por el usuario, las mismas son utilizadas para almacenar gráficos mientras otros gráficos son mostrados en la superficie visible. Crear la superficie primaria Mediante una llamada al método CreateSurface, vamos a crear una superficie primaria
DDSURFACEDESC ddsd; Crear la superficies no visibles Como hemos dicho, las supeficies no visible no son vistas por los usuarios, simplemente funcionan como zonas de almacenamiento de todo tipo de gráficos. El método de para crear un superficie no visible es sencillo, casí igual que crear una superficie visible.
DDSURFACEDESC ddsd; Tamaño de las superficies El tamaño de la superficie primaria ya está deteminado, pero no es así con el tamaño de las superficies no visibles, en donde tendremos que configurar nostros el tamaño que queramos que tenga nuetra superficie. El tamaño más aconsejable para una superficie no visible es el justo, ya que de ser muy grande le traerá dificultades a DirectDraw para usar eficientemente la memoria de video, y de ser muy pequeño como para que añada un proceso adicional, por gestionar muchas superficies pequeñas. El Blitter Una operación de blitter es simplemente una operación de copia de memoria; el contenido de la memoria se desplaza de un lugar a otro. Dentro de DirectDraw, tanto el origen como el destino de la copia serán objetos completos o partes de DirectDrawSurface. El objeto DirectDrawSurface proporciona dos métodos que realizan operaciones de copia mediante el blitter, el método Blt y el método BltFast Intercambio de Páginas El intercambiode páginas es algo obligatorio en cualquier juego o animación, está técnica consiste simplemente en utilizar varias superficies no visibles para almacenar las nuevas imágenes que serán copiadas a la superficie visible, logrando mejorar el efecto de la animación, evitando por ejemplo, el parpadeo que puede ocacionar no utilizar intercambio de páginas. Esta técnica también es llamada doble buffer y es muy común para proporcionar mejoras en el acceso a la memoria de video. Todos los cambios se realizan en las superficies no visibles y una vez que están listos se intercambian con la superficie visible. Para calcular las pérdidas y las ganancias que se obtienen mediante el intercambio de páginas es necesario medir la velocidad a la que se actualiza la animación. Este valor se denomina velocidad de actualización de cuadros, en donde se llama cuadro al proceso de dibujo de la escena completa, sin tener en cuenta si la misma es el terreno en donde se desarrolla un juego o un gráfico comúm. Uso de Superficies con intercambio de páginas Para utilizar intercambio de páginas en DirectDraw, hay que realizar los siguientes pasos: 1.
Crear la estructura de intercambio de páginas.
|
|||||||||||||||||||
|
||||||||||||||||||||