windows - sirve - ¿Mejores prácticas para la compatibilidad con Alt-Tab en una aplicación DirectX?
alt+tab para que sirve (4)
Al escribir aplicaciones de DirectX, obviamente es deseable ayudar al usuario a suspender la aplicación a través de Alt - Tab de una manera rápida y sin errores . ¿Cuál es el mejor conjunto de prácticas para garantizar esto? Las cosas que deben abordarse incluyen:
- Los mejores métodos para detectar cuándo se eliminó la pestaña de su aplicación y cuándo se devolvió.
- Qué recursos de DirectX se pierden cuando el usuario alterna las pestañas, y las mejores formas de lidiar con esto.
- Principales cosas que hacer y cosas que se deben evitar en la arquitectura de la aplicación a los fines del soporte alt-tab.
- Cualquier diferencia significativa entre las principales versiones de DirectX según se aplican a lo anterior.
Los trucos interesantes y los errores también son buenos de escuchar.
Asumiré que estás usando C ++ para mis respuestas, pero si puedes permitirte usar C #, XNA ( http://creators.xna.com/ ) es una plataforma de juego excelente que maneja todos estos problemas por ti.
1]
Este artículo es útil para los eventos de Windows en el procedimiento de ventana para detectar cuándo una ventana pierde o gana foco, puede manejar esto en su ventana principal: http://www.functionx.com/win32/Lesson05.htm . Además, consulte el mensaje WM_ACTIVATEAPP aquí: http://msdn.microsoft.com/en-us/library/ms632614(VS.85).aspx
2]
El dispositivo gráfico se pierde cuando la aplicación pierde el foco del modo de pantalla completa. Microsoft ofrece un artículo sobre cómo manejar esto: http://msdn.microsoft.com/en-us/library/bb174717(VS.85).aspx Este artículo también tiene un tutorial de dispositivo perdido: http://www.codesampler.com/dx9src/dx9src_6.htm
DirectInput también puede tener un estado de error de dispositivo perdido, aquí hay un enlace sobre eso: http://www.toymaker.info/Games/html/directinput.html
DirectSound también puede tener un dispositivo perdido estado de error, este artículo tiene un código que maneja eso: http://www.eastcoastgames.com/directx/chapter2.html
3]
Me aseguraría de nunca deshabilitar Alt-Tab. Es probable que desee una carga mínima de la CPU mientras la aplicación no está activa porque el usuario probablemente tiene Alt-Tabbed porque quiere hacer otra cosa, por lo que puede pausar por completo la aplicación o reducir los cuadros procesados por segundo. Si la aplicación se minimiza, por supuesto, no es necesario que represente nada. Después de pensar en un juego en red, mi mejor solución es que aún así se reduzcan los cuadros renderizados por segundo y la cantidad de paquetes de red manejados, posiblemente incluso descartando muchos de los paquetes que entran hasta que el juego se vuelva a activar.
4]
Honestamente, me limitaría a utilizar DirectX 9.0c (o DirectX 10 si quieres limitar tu sistema operativo objetivo a Vista y más nuevo) si es posible :)
Finalmente, el sdk de DirectX tiene numerosos tutoriales y ejemplos: http://www.microsoft.com/downloads/details.aspx?FamilyID=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en
En DX8 y 9 (y 10?) Si crea sus recursos (vértices e índices de búferes y texturas principalmente) usando D3DPOOL_MANAGED persistirán en dispositivos perdidos y no necesitarán recargarse. Esto se debe a que están almacenados en la memoria del sistema y el tiempo de ejecución DX se copia a la memoria de video automáticamente. Sin embargo, hay un costo de rendimiento debido a la copia y esto no se recomienda para datos de vértices que cambian rápidamente. Por supuesto, harías un perfil primero para determinar si hay un problema de velocidad :-)
Lo solucionamos al no usar ningún dispositivo DirectX de pantalla completa, sino que usamos una ventana de pantalla completa con la bandera más alta para que oculte la barra de tareas. Si saca Alt-Tab de eso, puede quitar el indicador y minimizar la ventana. Los recursos de textura se mantienen vivos por la ventana.
Sin embargo, este enfoque no maneja el evento de pérdida de dispositivo debido a ''pantalla de bloqueo'', Ctrl + Alt + Supr, conexiones de escritorio remoto, cambio de usuario o similar. Pero esos no necesitan ser manejados extremadamente rápido o eficientemente (al menos ese fue el caso en nuestra aplicación)
Todas las aplicaciones serias de D3D deberían poder manejar los dispositivos perdidos, ya que esto es algo que puede ocurrir por una variedad de razones.
En DX10 bajo Vista hay una nueva característica de "Detección y recuperación de tiempo de espera" que hace que sea común en mi experiencia que los dispositivos gráficos se reinicien, lo que causaría la pérdida de un dispositivo para su aplicación. Esto parece estar mejorando a medida que los controladores maduran, pero debes manejarlo de todos modos.