Поделиться через


Устранение неполадок (Direct3D 9)

В этом разделе перечислены распространенные категории проблем, которые могут возникнуть при написании приложений Direct3D, и способы их предотвращения.

Создание устройства

Если приложение завершается сбоем во время создания устройства, проверка следующие распространенные ошибки.

  • Убедитесь, что вы проверка возможности устройства, в частности глубину отрисовки.
  • Изучите код ошибки. D3DERR_OUTOFVIDEOMEMORY всегда возможно.
  • Используйте библиотеки динамической компоновки (DLL) для отладки DirectX и просмотрите выходные сообщения в отладчике.

Использование освещенных вершин

Приложения, использующие освещенные вершины, должны отключить подсистему освещения Direct3D, установив для D3DRS_LIGHTING состояние отрисовки значение FALSE. По умолчанию, если освещение включено, система устанавливает для любой вершины, которая не содержит нормальный вектор, значение 0 (черный), даже если входная вершина содержит ненулевое значение цвета. Так как освещенные вершины по своей природе не содержат нормальной вершины, любые сведения о цвете, передаваемые в Direct3D, теряются во время отрисовки, если включен механизм освещения.

Очевидно, что цвет вершин важен для любого приложения, которое выполняет собственное освещение. Чтобы система не налагала значения по умолчанию, убедитесь, что для D3DRS_LIGHTING задано значение FALSE.

Если приложение выполняется, но ничего не отображается, проверка для следующих распространенных ошибок.

  • Убедитесь, что треугольники не вырожены.
  • Убедитесь, что треугольники не выбраковываются.
  • Убедитесь, что преобразования согласованы внутри организации.
  • Проверьте параметры окна просмотра, чтобы убедиться, что они позволяют видеть треугольники.

Отладка

Отладка приложения Direct3D может быть сложной задачей. В дополнение к проверке всех возвращаемых значений попробуйте следующие методы, что особенно важно в программировании Direct3D, которое зависит от очень разных реализаций оборудования.

  • Переключитесь на отладочные библиотеки DLL.
  • Принудительная установка программного устройства, отключающее аппаратное ускорение, даже если оно доступно.
  • Принудительное попадание поверхностей в системную память.
  • Создайте параметр для запуска в окне, чтобы можно было использовать интегрированный отладчик.

Второй и третий варианты в этом списке помогут избежать блокировки Win16, которая в противном случае может привести к зависаю отладчика.

Кроме того, попробуйте добавить следующие записи в Win.ini.

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

Инициализация Floating-Point Borland

Компиляторы из Borland сообщают об исключениях с плавающей запятой способом, несовместимым с Direct3D. Чтобы решить эту проблему, добавьте обработчик исключений _matherr, как показано ниже:

// 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
}

Проверка параметров

По соображениям производительности отладочная версия direct3D Immediate Mode выполняет большую проверку параметров, чем розничная версия, которая иногда вообще не выполняет проверку. Это позволяет приложениям выполнять надежную отладку с более медленным компонентом времени выполнения отладки, прежде чем использовать более быструю розничную версию для настройки производительности и окончательного выпуска.

Хотя некоторые методы Direct3D Immediate Mode накладывают ограничения на допустимые значения, эти ограничения часто проверяются и применяются только в отладочной версии среды выполнения Direct3D Immediate Mode. Приложения должны соответствовать этим ограничениям, иначе при запуске в розничной версии Direct3D могут возникнуть непредсказуемые и нежелательные результаты. Например, метод IDirect3DDevice9::D rawPrimitive принимает параметр (PrimitiveCount), который указывает количество примитивов, которые будет отображать метод. Метод может принимать только значения от 0 до D3DMAXNUMPRIMITIVES. Если в отладочной версии Direct3D передается больше примитивов D3DMAXNUMPRIMITIVES, метод завершается корректной ошибкой, выводя сообщение об ошибке в журнал ошибок и возвращая значение ошибки приложению. И наоборот, если приложение выполняет ту же ошибку при выполнении с розничной версией времени выполнения, поведение не определено. Из соображений производительности метод не проверяет параметры, что приводит к непредсказуемой и полностью ситуационной реакции, когда они являются недопустимыми. В некоторых случаях вызов может работать, а в других — сбой памяти в Direct3D. Если недопустимый вызов постоянно работает с определенной конфигурацией оборудования и версией DirectX, нет никакой гарантии, что он будет продолжать работать на другом оборудовании или в более поздних выпусках DirectX.

Если в приложении возникают необъяснимые сбои при запуске с розничным файлом времени выполнения Direct3D, проверьте отладочную версию и внимательно изучите случаи, когда приложение передает недопустимые параметры. Используйте апплет панели управления DirectX, при необходимости переключитесь в среду выполнения отладки и проверка параметр "Break on D3DError". Этот параметр приведет к тому, что среда выполнения будет использовать метод Windows DebugBreak, чтобы принудительно остановить приложение при обнаружении ошибки приложения.

Советы по программированию