Слои API (Direct3D 10)
Среда выполнения Direct3D 10 создается с помощью уровней, начиная с базовых функций в основе и создания дополнительных функций и возможностей для разработчика в внешних слоях.
Основной уровень
Основной слой существует по умолчанию; обеспечивает очень тонкое сопоставление между API и драйвером устройства, минимизируя затраты на вызовы высокой частоты. Так как основной слой является важным для производительности, он выполняет только критически важную проверку.
Остальные слои являются необязательными. Как правило, слои добавляют функциональные возможности, но не изменяют существующее поведение. Например, основные функции будут иметь одинаковые возвращаемые значения независимо от экземпляра слоя отладки, хотя при создании экземпляра слоя отладки могут быть предоставлены дополнительные выходные данные отладки.
Создайте слои при создании устройства путем вызова D3D10CreateDevice и предоставления одного или нескольких значений D3D10_CREATE_DEVICE_FLAG.
Уровень отладки
Уровень отладки обеспечивает обширную дополнительную проверку параметров и согласованности (например, проверку компоновки шейдера и привязки ресурсов, проверку согласованности параметров и описание ошибок отчетов). Выходные данные, созданные уровнем отладки, состоят из очереди строк, доступных с помощьюинтерфейсаID3D10InfoQueue (см. настройка выходных данных отладки с помощью id3D10InfoQueue (Direct3D 10)). Ошибки, создаваемые основным уровнем, выделяются предупреждениями слоя отладки.
Чтобы создать устройство, поддерживающее уровень отладки, необходимо установить пакет SDK DirectX (чтобы получить D3D10SDKLayers.DLL), а затем указать флаг D3D10_CREATE_DEVICE_DEBUG при вызове D3D10CreateDevice. Конечно, запуск приложения с уровнем отладки будет значительно медленнее. Чтобы включить и отключить сообщения отладки для API D3DX10, вызовите D3DX10DebugMute.
Когда уровень отладки выводит список утечек памяти, он выводит список указателей интерфейса объекта вместе с их понятными именами. Понятное имя по умолчанию — "<неназванных>". Понятное имя можно задать с помощью метода ID3D10DeviceChild::SetPrivateData и guid WKPDID_D3DDebugObjectName, который находится в D3Dcommon.h. Например, чтобы назвать pTexture именем пакета SDKLayer mytexture.jpg, используйте следующий код:
const char c_szName[] = "mytexture.jpg";
pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );
Как правило, эти вызовы следует компилировать из рабочей версии.
Переключение на эталонный слой
Этот уровень позволяет приложению переходить между аппаратным устройством (HAL) и эталонным или программным устройством (REF). Чтобы переключить устройство, необходимо сначала создать устройство, которое поддерживает уровень переключения на ссылку (см. раздел D3D10CreateDevice) и вызвать ID3D10SwitchToRef::SetUseRef.
Все состояния устройства, ресурсы и объекты сохраняются с помощью этого перехода устройства. Однако иногда невозможно точно сопоставить данные ресурса. Это связано с тем, что некоторые сведения доступны аппаратному устройству, недоступному для эталонного устройства.
Практически все приложения в режиме реального времени используют реализацию HAL конвейера. При переключении конвейера с аппаратного устройства на эталонное устройство операции отрисовки выполняются одновременно как в оборудовании, так и в программном обеспечении. По мере отрисовки программного устройства требуется, чтобы ресурсы загружались в системную память. Для этого может потребоваться вытеснение других ресурсов, кэшированных в системной памяти.
Заметка
Эта функция переключения на уровень ссылок поддерживается только в Direct3D 10 и Direct3D 10.1 и больше не поддерживается в Direct3D 11 и более поздних версиях.
уровень Thread-Safe
Этот уровень предназначен для предоставления многопоточных приложений доступ к устройству из нескольких потоков.
Приложение Direct3D 10 может управлять синхронизацией устройств с помощью функций устройства. Это позволяет приложению включать и отключать критические разделы (временное включение и отключение многопоточной защиты), а также принимать и выпускать блокировку критически важных разделов по нескольким точкам входа API Direct3D 10. Потокобезопасный уровень включен по умолчанию. Для однопоточных приложений уровень, безопасный для потоков, не влияет на производительность.
Различия между Direct3D 9 и Direct3D 10:
- В отличие от Direct3D 9, API Direct3D 10 по умолчанию полностью безопасно для потоков.
Связанные разделы
-
функции API (Direct3D 10)