2009-06-09 10 views
37

Al escribir aplicaciones DirectX, obviamente, es deseable soportar el usuario suspende la aplicación a través de Alt - Tab de una manera que es rápido y libre de errores. ¿Cuál es el mejor conjunto de prácticas para garantizar esto? Las cosas que deben abordarse incluyen:¿Mejores prácticas para el soporte Alt-Tab en una aplicación DirectX?

  1. Los mejores métodos para detectar cuando su aplicación ha sido desactivada y cuando ha sido devuelta.
  2. Qué recursos de DirectX se pierden cuando el usuario alt-pestañas, y la mejor manera de lidiar con esto.
  3. Principales cosas que hacer y cosas que se deben evitar en la arquitectura de la aplicación para fines de compatibilidad con alt-tab.
  4. Cualquier diferencia significativa entre las principales versiones de DirectX, ya que se aplican a lo anterior.

Trucos y trucos interesantes también son buenos de escuchar.

+50

Por favor, envíe las respuestas a la válvula ;-) – ebo

+3

El enlace de muestra del código publicado a continuación parece adecuado para comenzar, así que solo añadiré esto: hemos encontrado que una forma fácil de probar esta situación es ejecutar la aplicación en modo ventana y bloquear el escritorio de Windows. De esta forma, puede probar fácilmente la situación del dispositivo perdido mientras se ejecuta bajo el depurador localmente. – Kylotan

+0

no estoy seguro de por qué estás eligiendo Valve. Half-life fue uno de los primeros juegos que tuve que hizo alt-tab sin problemas. Si hay problemas, es probablemente debido a DirectX (HL usó OpenGL en mi configuración) – SpliFF

Respuesta

42

Supongo que está utilizando C++ para mis respuestas, pero si puede permitirse usar C#, XNA (http://creators.xna.com/) es una plataforma de juego excelente que maneja todos estos problemas por usted.

1]

Este artículo es útil para los eventos de Windows en el procedimiento de ventana para detectar cuando una ventana pierde o gana foco, se podía manejar esto en su ventana principal: http://www.functionx.com/win32/Lesson05.htm. Además, la salida del mensaje WM_ACTIVATEAPP aquí: http://msdn.microsoft.com/en-us/library/ms632614(VS.85).aspx

2]

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 yo sólo se adhieren a DirectX 9.0c (o DirectX 10 si quieren limitar su sistema operativo de destino para Vista y posterior), si es posible :)

Por último, DirectX SDK tiene numerosos tutoriales y muestras: http://www.microsoft.com/downloads/details.aspx?FamilyID=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en

+1

Su respuesta se ve muy sólida; ¡Gracias! Creo que voy a plantear esta pregunta para recompensa cuando el período de espera se acabe, ya que creo que es un tema importante que falta para recursos coherentes. Si desea hacer más ediciones a su respuesta, le sugiero que resuma los puntos más importantes de los diversos enlaces; Sería bueno si alguien que busca este tema puede obtener tanta información relevante como sea posible en la respuesta. (Y los enlaces son, por supuesto, vulnerables a linkrot.) – chaos

+0

Buen gráfico de reputación vertical. Eres bastante el cazarrecompensas. :) – chaos

+0

Sí, ¡sorprende que no tengan una insignia para eso! – jjxtra

1

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ía primero un perfil para determinar si hay un problema de velocidad :-)

2

Lo solucionamos al no usar un dispositivo DirectX de pantalla completa, sino que usamos una ventana de pantalla completa con la bandera más alta para hacer esconde 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 perdido del 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)

2

Todas las aplicaciones D3D serias deberían poder manejar los dispositivos perdidos ya que esto es algo que puede suceder para una variedad de razones.

En DX10 bajo Vista hay una nueva característica de "Tiempo de espera de detección y recuperación" que hace que sea común en mi experiencia que los dispositivos gráficos se reinicien, lo que podría causar 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.

+0

El mejor 'dispositivo perdido', es el causado por una actualización del controlador ;-) –

+0

Chortle se ríe pero en serio. Ser capaz de manejar el cambio de contexto y poder restablecer el estado es una parte importante de la construcción de una aplicación sólida en un entorno multitarea. –

Cuestiones relacionadas