Codificación para una matriz de pantallas de muy, muy alta resolución

17

Se me ha encomendado la tarea de crear una demostración de "pantalla completa" en tiempo real para ejecutar en una matriz de 5x2 de televisores LED de más de 60 pulgadas: o, en otras palabras, una pantalla de 20 megapíxeles.

Tenemos una máquina construida que puede ejecutar un solo escritorio Win7 distribuido en las pantallas a resolución completa, y algunas tarjetas de video bastante decentes.

Mi pregunta es: aparte de la cantidad ridícula de trabajo que van a hacer mis sombreadores de píxeles, ¿hay alguna otra limitación de DX10. * Que entraría en juego aquí que no lo haría en una ventana gráfica de tamaño más sensato? No tendré acceso al hardware hasta la próxima semana, pero me gustaría tener algo escrito para entonces que pueda usar para comparar el sistema.

Actualizar

Si bien logré hacer que esto funcione en una sola máquina con un montón de tarjetas AMD EyeFinity (6 salidas), para que todo funcione sin problemas, la forma "más fácil" resultó ser crear una ventana DX por pantalla, ya que tiene una ventana de visualización causó algunos problemas de rendimiento: también lo hice funcionar bastante bien al distribuir la tarea en un grupo de máquinas, cada una de las cuales maneja dos pantallas.

Fue sorprendentemente fácil. Para mi aplicación XNA de prueba, agregué un GameComponent que captura algún estado del juego (posición / orientación de la cámara, etc.) y UDP lo envía a través de la subred local por cuadro.

Ese componente tiene un Modeinterruptor (enviar o recibir). Si está en Receivemodo, captura datagramas UDP y actualiza el estado del juego con la información del remitente. Sendel modo solo envía paquetes de estado y, a través de un servicio / demonio, hace que los nodos inicien o detengan la aplicación cliente. Cualquier cliente puede actuar como un "maestro", y cambiar un cliente a Sendmodo solicita que todos los demás nodos se conecten Receive. Es bastante entretenido ver lo que sucede cuando las personas luchan por el control.

Otro beneficio interesante: creé una aplicación de consola que procesa una serie de definiciones de estado de fotogramas clave (ubicación, hora, etc.) interpola según sea necesario y las envía usando el mismo código que se usa en el motor del juego. Esto me permite mover fácilmente el script, enviar transformaciones desde un navegador web, etc.

En general, se necesitaron unas 50 líneas de código para mantener sincronizadas varias copias de la aplicación. Parte de la complejidad adicional provino de desactivar la posición de la cámara para cada máquina y corregir algunas molestias de perspectiva / proyección, pero la mayor parte se redujo a un archivo de configuración por nodo.

3Dave
fuente
2
Esto suena como un proyecto muy divertido.
Cypher
1
Sí. Casi me reí y muah-ha-ha'd.
3Dave
3
Lo habría hecho con 10 máquinas baratas y básicas, cada una solo preocupada por representar su pequeña parte de la visión del mundo y conectada en red para mantener la sincronización y el control del tiempo desde alguna caja maestra. En lugar de una configuración avanzada de máquina sin prueba con un montón de riesgo de I + D, sería una solución enlatada con muy bajo riesgo. Pero solo soy yo, YMMV.
Patrick Hughes
Así es como me hubiera ido, pero no compré hardware. = /
3Dave
En realidad, el aspecto de renderizado sincronizado de la red suena increíble. Desafiante, pero ya puedo saber cómo hacerlo. Y proporciona cierta flexibilidad con respecto a: no es necesario representar múltiples flujos desde un cuadro si desea dividir la matriz. ¡"Paralelo" es una de mis palabras favoritas!
3Dave

Respuestas:

5

Me preocuparía tanto la configuración del hardware como el software. No tiene que ejecutar cada televisor con su resolución nativa, y el tamaño de la pantalla es diferente de la resolución. Sin embargo, supondré que los televisores de 60 "son cada uno de 1920x1080, por lo que la resolución nativa en todos ellos es 9600x2160 si se refería a 5 filas x 2 columnas de televisores, o 3840x5400 si se refería a 5 columnas x 2 filas.

La nueva tarjeta AMD Radeon, una 7970, admite una resolución de hasta 4096x2160 por pantalla, con un máximo de dos pantallas, si está utilizando DisplayPort 1.2 para transferir video. Por lo tanto, puede acercarse a la resolución nativa, sin embargo, no funcionará con hasta 5 televisores de esa manera.

El AMD Radeon 6870 Eyefinity 6 admite hasta 6 salidas a la vez, pero solo con una resolución máxima de 5760x2160. También es compatible con una configuración Crossfire que ayudará un poco a su rendimiento. Tenga en cuenta que las GPU adicionales no producirán una resolución máxima mayor.

A falta de una configuración de pantalla completamente personalizada, o algo para dividir su señal de video en más monitores / TV, no estoy seguro de cómo podrá ejecutar en 10 pantallas a la vez. Pero si tiene esa capacidad, lo que está buscando es la configuración de gráficos más rápida que admita una resolución más cercana a su resolución nativa. Una vez que tenga eso, su mejor opción es mantener sus sombreadores de píxeles lo más baratos posible y evitar el sobregiro, lo que significa calcular píxeles individuales más de una vez. La eliminación del frustum y la oclusión, y la clasificación por profundidad ayudarán en gran medida a reducir el sobregiro. En cuanto a un límite dentro de DX10, no estoy seguro de uno que limite la resolución, estoy seguro de que hay uno, pero probablemente sea mayor que cualquier tarjeta DX10 que exista.

Nic Foster
fuente
El hardware ya ejecuta toda la matriz, con cada pantalla individual a 1920x1080. Sus 5 columnas por dos filas. Otro tipo obtuvo una ventana OpenGL de resolución completa con un marco giratorio en ejecución. Solo me pregunto sobre las limitaciones de DX que podrían volver y morderme más tarde.
3Dave
1
Por lo que sé, no estará limitado por DX10 para una resolución como la que está describiendo. Si ya puede mostrar esa configuración, el rendimiento será su única preocupación, y manejar ese rendimiento será como cualquier otro juego / programa, solo se amplió un poco debido al espacio adicional en la pantalla.
Nic Foster
6

Puede crear fácilmente un objetivo de representación de tamaño equivalente para probar el rendimiento. Tendrá que reducirlo o acercarlo al copiarlo en el búfer posterior hasta obtener el hardware real.

Adán
fuente