El rendimiento del juego se reduce a la mitad con la duplicación de pantalla en macOS

Cuando ejecuto Portal en mi MBP sin una pantalla externa conectada, obtengo 60 fps sólidos. Cuando me conecto y reflejo otra pantalla (con la misma resolución y configuración del juego), cae a 30 fps, a veces a 20, y tiene un impacto muy notable en la experiencia del juego.

Es lo mismo independientemente del puerto de salida de video que use. El ahorro de energía de gráficos está deshabilitado.

He tratado de encontrar una confirmación de que la duplicación de pantalla afecta negativamente al rendimiento, pero solo me he topado con afirmaciones de que no lo hace y no debería hacerlo. Pero lo he probado muchas veces y es muy reproducible.

  • ¿Cómo se implementa la duplicación? ¿Por qué afecta tanto al rendimiento?
  • ¿La única forma de obtener un rendimiento decente en el juego es comprar un teclado externo y cerrar la tapa/pegar un imán a la pantalla/usar un hack de terminal?

MBP 15" mediados de 2014

Actualización sobre V-sync

Como Phong sospechaba correctamente, está relacionado con vsync. Sin él, obtengo unos ridículos 150+ fps y una buena capacidad de respuesta, aunque soy reacio a apagarlo debido al desgarro.

Sin embargo, todavía es un poco misterioso cómo la duplicación de pantalla interactúa y afecta a vsync.

La pantalla MBP es de 60 Hz y la pantalla externa también recibe una señal de 60 Hz. Cambiar la resolución del juego no afecta la señal de video (siempre 1080p), pero igualar la salida y la resolución del juego (por ejemplo, 720p@60) aún produce síntomas similares.

Respuestas (2)

Me parece que tienes habilitada la sincronización vertical . Esta función bloquea la velocidad de fotogramas a una fracción de la frecuencia de actualización de la pantalla (1, ½, ⅓...) para evitar artefactos visuales (específicamente, "desgarro") y velocidades de fotogramas fuera de control (que pueden dañar una GPU). Una buena indicación de esto es una velocidad de cuadro que salta de 30 a 60 FPS y viceversa, sin nada intermedio.

La duplicación está afectando el rendimiento lo suficiente como para reducir la velocidad de fotogramas por debajo de 60 FPS. Incluso si de lo contrario obtendría 59 FPS, la sincronización vertical reduciría su velocidad de fotogramas a 30 FPS.

Esto también puede resultar en un retraso de entrada. Dado que su pantalla/cursor ahora se vuelve a dibujar la mitad (o un tercio) de la frecuencia, la demora entre que mueve el mouse y ve el resultado en la pantalla sería dos o tres veces mayor.

Vaya a la configuración de video del Portal y deshabilite la sincronización vertical . No juego Portal, pero casi todos los juegos tienen esa opción. Puede llamarse V-Sync .

Es posible que deba cambiar del modo Ventana a Pantalla completa . Dado que macOS fuerza V-Sync para el escritorio principal, V-Sync aún puede aplicarse mientras se juega en una ventana.

Para minimizar los efectos adversos de deshabilitar V-Sync , muchos juegos ofrecen la opción de limitar la velocidad de fotogramas. Si esa opción está disponible, intente configurar un máximo de, p. 90 FPS o incluso 60 FPS . Esto a menudo ofrece lo mejor de ambos mundos.

Vea si una combinación de estas soluciones resuelve su problema.

Si prefiere mantener habilitado V-Sync , muchos juegos ofrecen una opción para habilitar Triple-Buffering . Esto ayudará a suavizar las velocidades de fotogramas (por lo tanto, minimizará las caídas repentinas en las velocidades de fotogramas). Habilitarlo también puede resultar en un mayor retraso de entrada, aunque generalmente no tan severo como el causado por la caída de 30 FPS.

Una última sugerencia sería tratar de extender su escritorio a la pantalla externa como un espacio separado (creo que es posible con Yosemite y superior). ¿Su caso de uso incluso requiere Mirroring ? No estoy tan familiarizado con esto en la Mac, pero no veo por qué esto no sería posible.

Explicación a vista de pájaro de lo que está causando que la velocidad de fotogramas disminuya con Mirroring:
Con Mirroring , su Mac tiene que mostrar el mismo fotograma en su pantalla interna y en su pantalla externa. Además de hacer que sus pantallas se esperen unas a otras, esto implica un "trabajo" adicional que incluye tiempo computacional adicional y administración de búfer (para asegurarse de que muestren lo mismo al mismo tiempo), así como el retraso de ida y vuelta. a través de su cable externo o peor, Wi-Fi/Bluetooth.

Mientras esto sucede, su GPU procesa el siguiente cuadro en su búfer interno, pero no lo envía a su pantalla hasta que recibe el visto bueno (debido a V-Sync ). Durante este período de espera, su GPU se detiene de manera efectiva y no procesa fotogramas adicionales (a menos que esté disponible Triple- o N-Buffering), lo que reduce aún más su velocidad de fotogramas. Luego, dependiendo de dónde se encuentre la visualización más lenta en su ciclo de actualización, la visualización del siguiente cuadro puede retrasarse una vez más hasta la siguiente fracción.

Debes tener en cuenta que para renderizar tu juego a 60 FPS, tu subsistema de gráficos solo tiene 33 ms para realizar todo ese trabajo adicional (menos el tiempo que necesita la GPU para renderizar esos cuadros en primer lugar). El viaje de ida y vuelta hacia y desde su pantalla externa solo puede demorar un par de milisegundos. El trabajo de sincronización es en sí mismo costoso (en términos de tiempo). No es incomprensible que sincronizar dos pantallas lleve más de 20 o 30 milisegundos.

Ahora, en el párrafo anterior asumí que su GPU estaba lista con el siguiente cuadro cuando sus pantallas terminaron de dibujar el actual. Imagina que no fuera así. Bueno, ahora las pantallas están hambrientas y son las que terminan esperando en la GPU. Probablemente termine cayendo a la siguiente fracción de su frecuencia de actualización más lenta. Lo que podría significar que una caída de 1-2 FPS V-Sync Off se convierte en 30 FPS con On .

Entonces, está tratando de sincronizar dos pantallas (a través de Mirroring ), luego intenta sincronizar AQUELLAS contra su GPU (a través de V-Sync ). El resultado es potencialmente mucha, mucha, mucha espera.

No es inusual experimentar cierta degradación del rendimiento cuando se conectan subsistemas con niveles de rendimiento dispares. Por eso se crearon los búferes y las operaciones asincrónicas.

Al sincronizar, un retraso en cualquier lugar provoca retrasos en todas partes.

Para maximizar el rendimiento, es mejor dejar que todos hagan su trabajo en su propio tiempo.

Gracias por tu respuesta. Relacionando esto con la duplicación, supongo que está diciendo que está limitando la velocidad de fotogramas a la frecuencia de la señal de video más lenta. Esa es una buena observación. Pero aún me sorprende que el mouse parezca lento y que baje a <30 fps en situaciones que funcionarían a 60 en un monitor.
Cada redibujado del cursor puede retrasarse hasta la siguiente actualización del cuadro, que sería el doble de tiempo que antes (no estoy seguro de esto, pero explicaría la lentitud de entrada). Yo diría que intente deshabilitar V-Sync, luego vea si persisten los problemas relacionados una vez que se restablezca la velocidad de fotogramas. Tenga en cuenta que con V-Sync activado, cualquier cosa que reduzca su velocidad de fotogramas por debajo de 60 FPS, la reducirá automáticamente a 30, incluso si la velocidad de fotogramas fuera 59.
Lo probé y actualicé la pregunta. Quise decir mouselook (sin cursor real en el juego). Todavía tengo problemas para entender cómo la duplicación de pantalla en combinación con vsync degrada el rendimiento con dos señales de 60 Hz en lugar de una.
Buena información, gracias. Con respecto al modo de ventana, no previene el desgarro de la pantalla (lo que supongo que se espera, ya que probablemente se ejecutaría extremadamente lento si el renderizado tomara un desvío a través del administrador de ventanas).
Correcto, jugar a pantalla completa solo habilitaría V -Sync (si macOS lo impide). En lo que respecta a la apariencia del mouse, sigue siendo la misma idea: dado que hay un retraso mayor en dibujar el siguiente cuadro, el resultado de la acción del mouse también se retrasa.
Su teoría suena razonable. Materia interesante. Mi caso de uso no requiere duplicación, fue lo más cerca que pude llegar a minimizar el uso de recursos. Desafortunadamente, hacer un escritorio extendido no funcionó ya que el cursor queda atrapado fuera del juego (no lo había probado antes, porque casi siempre hay problemas de enfoque como ese).

Condensando algo de información sobre lo que funcionó al final:

  • Vsync habilitado
  • Escritorios separados en cada monitor
  • Mueva el escritorio principal (la barra de menú en la configuración de pantalla de macOS) a la pantalla en la que desea jugar. Portal puede seleccionar un monitor en el juego, pero macOS arruinará el cursor de todos modos a menos que juegues en la pantalla principal, por lo que esa opción es inútil.
  • Atenúa la otra pantalla hacia abajo.

Lo mismo para Portal 2. A diferencia del primer juego, también admite almacenamiento en búfer triple.

Usar aplicaciones como DisableMonitor solo complica las cosas. De alguna manera termina con el sistema de coordenadas del monitor deshabilitado (y el fondo del escritorio) superpuesto al habilitado, haciendo que los cursores aparezcan donde no están. El desarrollador parece haber tomado precauciones por el aspecto de esta línea: CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID), pero parece que no funciona, al menos no en macOS sierra.