Compartir a través de


Dispositivos perdidos

Un dispositivo Direct3D puede estar en un estado operativo o en un estado perdido. El estado operativo es el estado normal del dispositivo en el que se ejecuta el dispositivo y presenta toda la representación según lo previsto. El dispositivo realiza una transición al estado perdido cuando un evento, como la pérdida de foco del teclado en una aplicación de pantalla completa, hace que la representación sea imposible. El estado perdido se caracteriza por el error silencioso de todas las operaciones de representación, lo que significa que los métodos de representación pueden devolver códigos de éxito aunque se produzca un error en las operaciones de representación.

Por diseño, no se especifica el conjunto completo de escenarios que pueden hacer que un dispositivo se pierda. Algunos ejemplos típicos incluyen la pérdida de foco, como cuando el usuario presiona ALT+TAB o cuando se inicializa un cuadro de diálogo del sistema. Los dispositivos también se pueden perder debido a un evento de administración de energía o cuando otra aplicación asume la operación de pantalla completa. Además, cualquier error al restablecer un dispositivo coloca el dispositivo en un estado perdido.

Se garantiza que todos los métodos derivados de IUnknown funcionen después de que se pierda un dispositivo. Después de la pérdida de dispositivos, cada función generalmente tiene las tres opciones siguientes:

  • Error con un error de "dispositivo perdido": esto significa que la aplicación debe reconocer que se perdió el dispositivo, de modo que la aplicación identifique que algo no está sucediendo según lo previsto.
  • Error silencioso, devolviendo S_OK o cualquier otro código devuelto: si se produce un error en una función silenciosamente, la aplicación generalmente no puede distinguir entre el resultado de "correcto" y un "error silencioso".
  • Devuelve un código de retorno.

Responder a un dispositivo perdido

Un dispositivo perdido debe volver a crear recursos (incluidos los recursos de memoria de vídeo) después de restablecerlo. Si se pierde un dispositivo, la aplicación consulta al dispositivo para ver si se puede restaurar al estado operativo. Si no es así, la aplicación espera hasta que se pueda restaurar el dispositivo.

Si el dispositivo se puede restaurar, la aplicación prepara el dispositivo destruyendo todos los recursos de memoria de vídeo y las cadenas de intercambio. El restablecimiento es el único procedimiento que tiene un efecto cuando se pierde un dispositivo y es la única manera en que una aplicación puede cambiar el dispositivo de un estado perdido a un estado operativo. Se producirá un error en el restablecimiento a menos que la aplicación libere todos los recursos asignados, incluidos los destinos de representación y las superficies de galería de símbolos de profundidad.

Por lo general, las llamadas de alta frecuencia de Direct3D no devuelven ninguna información sobre si el dispositivo se ha perdido. La aplicación puede seguir llamando a métodos de representación, sin recibir la notificación de un dispositivo perdido. Internamente, estas operaciones se descartan hasta que el dispositivo se restablece al estado operativo.

Operaciones de bloqueo

Internamente, Direct3D hace suficiente trabajo para asegurarse de que una operación de bloqueo se realizará correctamente después de que se pierda un dispositivo. Sin embargo, no se garantiza que los datos del recurso de memoria de vídeo sean precisos durante la operación de bloqueo. Se garantiza que no se devolverá ningún código de error. Esto permite que las aplicaciones se escriban sin preocuparse por la pérdida de dispositivos durante una operación de bloqueo.

Recursos

Los recursos pueden consumir memoria de vídeo. Dado que un dispositivo perdido está desconectado de la memoria de vídeo que pertenece al adaptador, no es posible garantizar la asignación de memoria de vídeo cuando se pierde el dispositivo. Como resultado, todos los métodos de creación de recursos se implementan correctamente, pero de hecho asignan solo memoria ficticia del sistema. Dado que cualquier recurso de memoria de vídeo debe destruirse antes de cambiar el tamaño del dispositivo, no hay ningún problema de asignación excesiva de memoria de vídeo. Estas superficies ficticias permiten que las operaciones de bloqueo y copia aparezcan normalmente hasta que la aplicación detecte que se ha perdido el dispositivo.

Toda la memoria de vídeo debe liberarse antes de que un dispositivo pueda restablecerse de un estado perdido a un estado operativo. La transición a un estado operativo destruye automáticamente otros datos de estado.

Se recomienda desarrollar aplicaciones con una única ruta de acceso de código para responder a la pérdida de dispositivos. Es probable que esta ruta de acceso de código sea similar, si no es idéntica, a la ruta de acceso del código tomada para inicializar el dispositivo en el inicio.

Datos recuperados

Direct3D permite a las aplicaciones validar los estados de textura y representación en la representación de un solo paso por parte del hardware.

Direct3D también permite a las aplicaciones copiar imágenes generadas o escritas previamente de recursos de memoria de vídeo en recursos de memoria del sistema no volátiles. Dado que las imágenes de origen de estas transferencias pueden perderse en cualquier momento, Direct3D permite que dichas operaciones de copia produzcan un error cuando se pierda el dispositivo.

Las operaciones de copia pueden producir un error, ya que no hay ninguna superficie principal cuando se pierde el dispositivo. La creación de cadenas de intercambio también puede producir un error porque no se puede crear un búfer de reserva cuando se pierde el dispositivo.

Dispositivos