Compartir a través de


Solución de problemas (Direct3D 9)

En este tema se enumeran las categorías comunes de problemas que puede encontrar al escribir aplicaciones de Direct3D y cómo evitarlos.

Creación de dispositivos

Si se produce un error en la aplicación durante la creación del dispositivo, compruebe los siguientes errores comunes.

  • Asegúrese de comprobar las funcionalidades del dispositivo, especialmente las profundidades de representación.
  • Examine el código de error. D3DERR_OUTOFVIDEOMEMORY siempre es posible.
  • Use las bibliotecas de vínculos dinámicos (DLL) de DirectX de depuración y revise los mensajes de salida en el depurador.

Uso de vértices iluminados

Las aplicaciones que usan vértices iluminados deben deshabilitar el motor de iluminación de Direct3D estableciendo el estado de representación D3DRS_LIGHTING en FALSE. De forma predeterminada, cuando la iluminación está habilitada, el sistema establece el color de cualquier vértice que no contenga un vector normal en 0 (negro), incluso si el vértice de entrada contenía un valor de color distinto de cero. Dado que los vértices iluminados no contienen, por su naturaleza, un vértice normal, cualquier información de color pasada a Direct3D se pierde durante la representación si el motor de iluminación está habilitado.

Obviamente, el color del vértice es importante para cualquier aplicación que realice su propia iluminación. Para evitar que el sistema impone los valores predeterminados, asegúrese de establecer D3DRS_LIGHTING en FALSE.

Si la aplicación se ejecuta pero no hay nada visible, compruebe los siguientes errores comunes.

  • Asegúrese de que los triángulos no se degeneran.
  • Asegúrese de que los triángulos no se van a seleccionar.
  • Asegúrese de que las transformaciones sean internamente coherentes.
  • Compruebe la configuración de la ventanilla para asegurarse de que permiten ver los triángulos.

Depuración

La depuración de una aplicación direct3D puede ser difícil. Pruebe las técnicas siguientes, además de comprobar todos los valores devueltos, un consejo especialmente importante en la programación direct3D, que depende de implementaciones de hardware muy diferentes.

  • Cambie a archivos DLL de depuración.
  • Forzar un dispositivo de solo software, desactivar la aceleración de hardware incluso cuando esté disponible.
  • Forzar superficies en la memoria del sistema.
  • Cree una opción para ejecutarse en una ventana, de modo que pueda usar un depurador integrado.

Las opciones segunda y tercera de esta lista pueden ayudarte a evitar el bloqueo de Win16 que, de lo contrario, puede hacer que el depurador se bloquee.

Además, intente agregar las siguientes entradas a Win.ini.

[Direct3D] 
debug=3 
[DirectDraw] 
debug=3 

Inicialización de Borland Floating-Point

Los compiladores de Borland informan de excepciones de punto flotante de una manera que no es compatible con Direct3D. Para solucionar este problema, incluya un controlador de excepciones de _matherr como el siguiente:

// Borland floating point initialization 
#include <math.h>
#include <float.h>

void initfp(void)
{
    // Disable floating point exceptions
    _control87(MCW_EM,MCW_EM);
}

int _matherr(struct _exception  *e)
{
    e;               // Dummy reference to catch the warning
    return 1;        // Error has been handled
}

Validación de parámetros

Por motivos de rendimiento, la versión de depuración del tiempo de ejecución del modo inmediato de Direct3D realiza más validación de parámetros que la versión comercial, que a veces no realiza ninguna validación. Esto permite a las aplicaciones realizar una depuración sólida con el componente en tiempo de ejecución de depuración más lento antes de usar la versión comercial más rápida para el ajuste del rendimiento y la versión final.

Aunque varios métodos del modo inmediato de Direct3D imponen límites a los valores que pueden aceptar, estos límites a menudo solo se comprueban y aplican mediante la versión de depuración del tiempo de ejecución del modo inmediato de Direct3D. Las aplicaciones deben cumplir estos límites, o los resultados impredecibles y no deseados pueden producirse al ejecutarse en la versión comercial de Direct3D. Por ejemplo, el método IDirect3DDevice9::D rawPrimitive acepta un parámetro (PrimitiveCount) que indica el número de primitivos que representará el método. El método solo puede aceptar valores entre 0 y D3DMAXNUMPRIMITIVES. En la versión de depuración de Direct3D, si pasa más de primitivos D3DMAXNUMNUMPRIMITIVES, el método produce un error correctamente, imprime un mensaje de error en el registro de errores y devuelve un valor de error a la aplicación. Por el contrario, si la aplicación produce el mismo error cuando se ejecuta con la versión comercial del tiempo de ejecución, el comportamiento no está definido. Por motivos de rendimiento, el método no valida los parámetros, lo que da lugar a un comportamiento impredecible y completamente situacional cuando no son válidos. En algunos casos, la llamada podría funcionar y, en otros casos, podría provocar un error de memoria en Direct3D. Si una llamada no válida funciona de forma coherente con una configuración de hardware determinada y la versión de DirectX, no hay ninguna garantía de que seguirá funcionando en otro hardware o con versiones posteriores de DirectX.

Si la aplicación encuentra errores no descritos al ejecutarse con el archivo en tiempo de ejecución de Direct3D comercial, pruebe con la versión de depuración y busque detenidamente los casos en los que la aplicación pasa parámetros no válidos. Use el applet del panel de control de DirectX, cambie al entorno de ejecución de depuración si es necesario y active la opción "Interrumpir en D3DError". Esta opción obligará al tiempo de ejecución a usar el método Windows DebugBreak para forzar que la aplicación se detenga cuando se detecte un error de aplicación.

Sugerencias de programación