D3D / DXGI maneja la transición de pantalla completa

9

Tengo una aplicación D3D11 y quiero agregar soporte de pantalla completa adecuado. Ahora puedo dejar que DXGI cambie mi ventana a pantalla completa por mí, y tengo la impresión de que DXGI se encargará de todo lo necesario para hacer que la cadena de intercambio se voltee hacia adelante y hacia atrás en lugar de bloquearlos.

Sin embargo, dejar que DXGI realice el cambio parece poco confiable con una configuración de monitores múltiples: las pantallas secundarias permanecen completamente en negro después del cambio la mayor parte del tiempo, sin razón aparente o patrón.

Puede tomar varias veces cambiar de un lado a otro antes de que aparezca la ventana de pantalla completa y que el resto del escritorio se muestre en las otras pantallas.

Aparentemente no estoy solo con esto, Battlefield 3 y WoW parecen tener problemas similares para mucha gente.

Ahora, la pregunta real: supongo que dado que incluso esas compañías de desarrollo de juegos AAA no pueden hacer que esto funcione, mi mayor esperanza sería realizar el cambio a pantalla completa yo mismo.

¿Hay algo que pueda hacer para elevar mi ventana / cadena de intercambio a un modo de pantalla completa adecuado para voltear el búfer?


fuente
Al momento de escribir esto, la versión actual de World of Warcraft ya no tiene los problemas de configuración del modo de visualización / pérdidas de memoria que mencionó. Ciertamente fueron problemáticos, pero se han solucionado a partir del 7.3.2
Gazer el

Respuestas:

3

Que yo sepa, lo único que funciona es:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

al inicio de su solicitud y:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

antes de dejar de fumar Para las transiciones, proceda como de costumbre. Lo intenté InvalidateRect(NULL, NULL, true)justo después de cambiar a pantalla completa en vano. Espero que esto ayude.

Arrendajo
fuente
Después de intentar todo, parece que estás en lo correcto. Solo deshabilitar la composición de manera confiable evita que esto suceda. No es la respuesta que esperaba, pero supongo que mejor que nada.
Tenga en cuenta que Windows 8.1 y versiones posteriores ignoran esta configuración. No puede deshabilitar DWM.
Chuck Walbourn
1

De hecho, no eres el único que enfrenta este problema . Lo primero que debe verificar: asegúrese de estar utilizando los últimos controladores / beta / de primera clase para la tarjeta de video que está utilizando.

Ahora, diría que solo hay una pequeña posibilidad de que pueda hacer que esto funcione mejor que la implementación automática de DXGI. Este tipo de problema depende en gran medida del proveedor del adaptador, la versión del controlador y la configuración del monitor. Entonces, al arreglarlo en una máquina, puede terminar rompiéndolo en más.

Aconsejo no volver a la edad oscura de DirectX 9, donde tenía que hacer todo a mano. Una mejor idea sería intentar arreglar el cambio automático. Algunos senderos a seguir:

  • Lea la (escasa) documentación cuidadosamente.

  • Si aún no lo está haciendo, intente responder al WM_SIZEevento que recibe al cambiar de / a pantalla completa, como se describe aquí . Si lo hace, asegúrese de liberar todas las referencias al búfer de respaldo antes de llamar ResizeBuffers, como se describe allí . De lo contrario, podría causar este tipo de semi-problemas extraños.

  • Intente comenzar directamente en pantalla completa y cree su cadena de intercambio con uno de los modos de visualización enumerados . Si esto funciona todo el tiempo, esto podría significar que no está utilizando uno de los modos de visualización enumerados al manejar WM_SIZE(o no del todo, cosas como la frecuencia de actualización puede ser importante).

  • Intenta jugar con el efecto de intercambio y el conteo del búfer de la descripción de tu cadena de intercambio . Probablemente deberías estar usando DXGI_SWAP_EFFECT_SEQUENTIALy a BufferCount> = 2. Quizás tu controlador tenga poca compatibilidad para opciones más "exóticas".

Laurent Couvidou
fuente
Cambiar el tamaño de los tampones funciona bien. También probé todos los efectos de intercambio, no parecen hacer la diferencia, y siempre he usado 2 buffers. Intentaría con la pantalla completa (aunque no sé a qué te refieres con "usar uno de los modos de visualización enumerados" - cuando respondo a WM_SIZE todo lo que hago es ResizeBuffers, no hay ningún lugar para pasar un modo de visualización como argumento ) pero de forma espontánea instalado windows 8 y adivina qué, no puedo replicar el problema en este momento ..
Volví a windows7 e intenté crear la cadena de intercambio en pantalla completa desde el principio, pero el problema persiste.