Principal | Buscar | Contacto | Mapa |  

 


Guía de DirectX

Introducción

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.

Recientemente Microsoft  lanzó la última versión en español  que se puede conseguir directamente desde Aquí download
Nota: Existen dos versiones de DirectX, una para usuarios, que permite correr la mayoría de los juegos y otra para desarrolladores llamada DirectX SDK.

Ventajas de DirectX
 

  • Acceso directo al hardware: Especialmente importante en el caso de la tarjeta de video.
  • Rapides: La performance en el desarrollo de un juego es fundamental, DirectX permite obtener todo el rendimiento posible del hardware, inclusive, aprovechando mejoras en el Hardware que podrían aparecer , después de construir la aplicación.
  • Facilidad: Sin dudas, tareas como configurar el tipo de video, la profundidad de colores, la reproducción de sonido, la compatibilidad con el hardware existente, resultan tareaa más sencillas trabajando con DirectX en Windows, que en la epoca que se trabajaba bajo DOS (espero que los nostálgicos de D.O.S. no se enojen).

Componentes de DirectX

DirectDraw
DirectDraw es una librería de bajo nivel contenida procipalmente en el archivo ddraw.dll, que le permite al programador acceder al hardware de video directamente. Además a traves de DirectDraw podemos implementar varias técnicas para el manejo de la memoria, intercambio de páginas, sobreimpreciones, etc.
Direct3D
Direct3D proporciona un librería que permite optimizar la renderización de objetos 3D tomando las ventajas del hardware existente, o mediante software si no se encontrara el hardware adecuado.
DirectSound
Como su nombre lo indíca, la librería de DirectSound maneja todo lo relacionado con el sonido. Proporcionado tecnologías de mixing, sonido estéreo y 3D, aprovenchando al máximo las capacidades del hardware.
DirectPlay
DirectPlay se encarga de las características multijugador de los juegos.
DirectInput
Proporciona una interfaz para el manejo de entrada y salida. Como el teclado, el mouse, joystick, etc.
DirectSetup
Se utiliza para automatizar la instalación de los controladores 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 un componente de software que permite al desarrollador manipular directamente la memoria de video y aplicar diversas técnicas para copiar bloques de memoria, mezclar mapas de bits, intercambio de páginas, etc.

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 arquitectura principal de DirectX está formada por 2 controladores:

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 ) ) )
{
return Fail ( hwnd, "No se creó el Objeto DirectDraw.\n" );
}

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 ) )
{
return Fail ( hwnd, "No se pudo fijar el nivel cooperativo.\n" );
}

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 ) ) )
{
return Fail ( hwnd, "No se pudo fijar el modo de video.\n" );
}

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;
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDS_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if ( FAILED( lpdd->CreateSurface( &ddsd, &lpDDSPrimary, NULL ) ) )
{
return Fail( hwnd, "No se creo la superficie primaria.\n" );
}

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;
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDS_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwHeight = 50;
ddsd.dwWidth = 50;

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.
2. Obtener un puntero al buffer posterior.
3. Dibujar en el buffer posterior.
4. Disparar la operación de intercambio de páginas.

Autor : Marcos Alzaga

 
 

 


 
 | Home | Buscar | Mapa Sitio | Categorías | Contacto |
Copyright © 2002 - 2007 - Zona Gratuita .COM - Permitido el uso Parcial citando Fuentes y Autores
 | Zona Gratuita | Casino onLine | ShaFree | Utilidades Gratis |