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


Потерянные устройства

Устройство Direct3D может находиться в рабочем состоянии или в потерянном состоянии. Рабочее состояние — это нормальное состояние устройства, в котором выполняется устройство и отображает все отрисовки должным образом. Устройство переходит в потерянное состояние, когда событие, например потеря фокуса клавиатуры в полноэкранном приложении, приводит к невозможности отрисовки. Потерянное состояние характеризуется автоматическим сбоем всех операций отрисовки, что означает, что методы отрисовки могут возвращать коды успешности, даже если операции отрисовки завершаются сбоем.

При разработке полный набор сценариев, который может привести к потере устройства, не указан. Некоторые типичные примеры включают потерю фокуса, например при нажатии клавиш ALT+TAB или при инициализации системного диалога. Устройства также могут быть потеряны из-за события управления питанием или когда другое приложение предполагает полноэкранную операцию. Кроме того, любой сбой при сбросе устройства помещает устройство в потерянное состояние.

Все методы, производные от IUnknown , гарантированно работают после потери устройства. После потери устройства каждая функция обычно имеет следующие три варианта:

  • Сбой с ошибкой "потеря устройства" — это означает, что приложение должно распознать, что устройство было потеряно, чтобы приложение идентифицировало, что что-то не происходит должным образом.
  • Автоматически завершается сбоем, возвращая S_OK или любой другой код возврата. Если функция автоматически завершается сбоем, приложение обычно не может различать результат "успешности" и "автоматический сбой".
  • Возвращает возвращаемый код.

Реагирование на потерянное устройство

Потерянное устройство должно повторно создать ресурсы (включая ресурсы памяти видео) после сброса. Если устройство потеряно, приложение запрашивает устройство, чтобы узнать, можно ли восстановить его в рабочем состоянии. Если нет, приложение ожидает восстановления устройства.

Если устройство можно восстановить, приложение подготавливает устройство, уничтожая все ресурсы видео-памяти и любые цепочки буферов. Сброс — это единственная процедура, которая оказывает влияние при потере устройства и является единственным способом, с помощью которого приложение может изменить устройство с потерянного на рабочее состояние. Сброс завершится ошибкой, если приложение не освобождает все выделенные ресурсы, включая целевые объекты отрисовки и поверхности элементов глубины.

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

Операции блокировки

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

Ресурсы

Ресурсы могут использовать память видео. Так как потерянное устройство отключено от памяти видео, принадлежащей адаптеру, невозможно гарантировать выделение памяти видео при потере устройства. В результате все методы создания ресурсов реализуются для успешного выполнения, но на самом деле выделяют только фиктивную системную память. Так как перед изменением размера устройства необходимо уничтожить любой ресурс видео-памяти, проблема чрезмерного выделения памяти видео не возникает. Эти фиктивные поверхности позволяют выполнять операции блокировки и копирования обычно, пока приложение не обнаружит, что устройство было потеряно.

Перед сбросом устройства из потерянного состояния в рабочее состояние необходимо освободить всю память видео. Другие данные состояния автоматически уничтожаются переходом к рабочему состоянию.

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

Извлеченные данные

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

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

Операции копирования могут завершиться ошибкой, так как при потере устройства нет основной поверхности. Создание цепочек буферов также может завершиться ошибкой, так как не удается создать задний буфер при потере устройства.

Устройства