Codifica per un array di display ad altissima risoluzione


17

Mi è stato affidato il compito di costruire una demo "a schermo intero" in tempo reale per l'esecuzione su un array 5x2 di TV LED da 60+ pollici: o, in altre parole, un display da 20 megapixel.

Abbiamo una macchina costruita in grado di eseguire un singolo desktop Win7 distribuito sui display alla massima risoluzione e alcune schede video abbastanza decenti.

La mia domanda è: a parte la ridicola quantità di lavoro che i miei pixel shader stanno per fare, ci sono altre limitazioni di DX10. * Che entrerebbero in gioco qui che non sarebbero su un viewport più sano? Non avrò accesso all'hardware fino alla prossima settimana, ma mi piacerebbe avere qualcosa scritto da allora che posso usare per confrontare il sistema.

Aggiornare

Mentre Imanaged per farlo funzionare su una singola macchina con un mazzo di schede AMD EyeFinity (6 output) - per far funzionare le cose senza intoppi, il modo "più semplice" si è rivelato essere quello di creare una finestra DX per display con schermi a finestre ha causato alcuni problemi di prestazioni: ho anche funzionato abbastanza bene distribuendo l'attività su un gruppo di macchine, ognuna delle quali guida due schermi.

È stato sorprendentemente facile. Per la mia app XNA di prova, ho aggiunto un GameComponent che acquisisce uno stato del gioco (posizione / orientamento della telecamera, ecc.) E lo invia tramite UDP alla rete locale per frame.

Quel componente ha un Modeinterruttore (invia o ricevi). Se è in Receivemodalità, rileva i datagrammi UDP e aggiorna lo stato del gioco con le informazioni del mittente. Sendmode invia semplicemente pacchetti di stato e, tramite un servizio / demone, provoca l'avvio o l'arresto dei client da parte dei nodi. Qualsiasi client può fungere da "master" e la commutazione in Sendmodalità client richiede la commutazione di tutti gli altri nodi Receive. È abbastanza divertente vedere cosa succede quando le persone combattono per il controllo.

Un altro vantaggio evidente: ho creato un'app console che elabora una serie di definizioni di stato dei fotogrammi chiave (posizione, ora, ecc.) Interpola secondo necessità e li invia utilizzando lo stesso codice utilizzato nel motore di gioco. Ciò mi consente di spostare facilmente gli script, inviare trasformazioni da un browser Web, ecc.

Tutto sommato, sono state necessarie circa 50 righe di codice per sincronizzare più copie dell'app. Qualche ulteriore complessità derivava dall'impostare la posizione della telecamera per ogni macchina e correggere alcuni fastidi di prospettiva / proiezione, ma la maggior parte di ciò si riduceva a un file di configurazione per nodo.


2
Sembra un progetto davvero divertente.
Cypher,

1
Sì. Ho quasi ridacchiato e muah-ah-ah.
3Daveva il

3
Lo avrei fatto con 10 macchine da merce sporche a buon mercato, ognuna preoccupata solo di renderlo un piccolo pezzo della visione del mondo e collegato in rete per mantenere la sincronizzazione e il controllo del tempo da qualche scatola master. Invece di un limite massimo, configurazione della macchina non testata con una tonnellata di rischio di ricerca e sviluppo sarebbe una soluzione fissa a rischio molto basso. Sono solo io, YMMV.
Patrick Hughes,

È così che sarei andato, ma non ho comprato hardware thr. = /
3Daveva il

In realtà, l'aspetto della rete, il rendering sincronizzato sembra fantastico. Sfidante, ma posso già capire come farlo. E offre una certa flessibilità in merito: non è necessario eseguire il rendering di più flussi da una casella se si desidera dividere l'array. "Parallelo" è una delle mie parole preferite!
3Daveva il

Risposte:


5

Mi preoccuperei tanto della configurazione hardware quanto del software. Non è necessario eseguire ogni TV alla sua risoluzione nativa e le dimensioni dello schermo sono diverse dalla risoluzione. Suppongo che i televisori da 60 "siano ciascuno 1920x1080, quindi la risoluzione nativa per tutti loro è 9600x2160 se intendevi 5 righe x 2 colonne di TV o 3840x5400 se intendevi 5 colonne x 2 righe.

La più recente scheda AMD Radeon, una 7970 supporta una risoluzione fino a 4096x2160 per display, con un massimo di due display, se si utilizza DisplayPort 1.2 per trasferire video. Quindi potrebbe avvicinarti alla risoluzione nativa, tuttavia in questo modo non funzionerà con un massimo di 5 TV.

AMD Radeon 6870 Eyefinity 6 supporta fino a 6 uscite contemporaneamente, ma solo con una risoluzione massima di 5760x2160. Supporta anche una configurazione Crossfire che aiuterà un po 'le tue prestazioni. Tieni presente che le GPU extra non produrranno una risoluzione massima maggiore.

A meno di un'impostazione di visualizzazione completamente personalizzata o qualcosa per dividere il segnale video su più monitor / TV, non sono sicuro di come sarai in grado di eseguire 10 schermi contemporaneamente. Ma se hai questa capacità, allora quello che stai cercando è la configurazione grafica più veloce che supporti una risoluzione più vicina alla tua risoluzione nativa. Una volta che hai la scommessa migliore è solo per mantenere i tuoi shader di pixel il più economici possibile ed evitare il sovraccarico, il che significa calcolare singoli pixel più di una volta. La riduzione del frustum e dell'occlusione e l'ordinamento in profondità aiuteranno notevolmente a ridurre il sovraccarico. Per quanto riguarda un limite all'interno di DX10, non sono sicuro di uno che limiti la risoluzione, sono sicuro che ce ne sia uno, ma probabilmente è maggiore di qualsiasi scheda DX10 esistente.


L'hardware esegue già l'intero array, con ogni singolo display a 1920x1080. le sue 5 colonne per due file. Un altro ragazzo ha una finestra OpenGL ad alta risoluzione con un wireframe rotante in esecuzione. Mi chiedo solo eventuali limitazioni DX che potrebbero tornare e mordermi in seguito.
3Daveva il

1
Per quanto ne so non sarai limitato da DX10 per la risoluzione che stai descrivendo. Se sei in grado di visualizzare già su quella configurazione, le prestazioni saranno la tua unica preoccupazione, e gestirle sarà esattamente come qualsiasi altro gioco / programma, semplicemente ingrandito un po 'a causa dello spazio aggiuntivo sullo schermo.
Nic Foster,

6

È possibile creare facilmente un obiettivo di rendering di dimensioni equivalenti per testare le prestazioni. Dovrai ridimensionarlo o ingrandirlo quando lo copi nel back buffer fino a quando non ottieni l'hardware reale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.