Zadanie polegało mi na zbudowaniu demonstracji „pełnoekranowej” w czasie rzeczywistym, aby działała na matrycy 5 x 2 telewizorów LED o przekątnej 60 cali i, innymi słowy, na ekranie o rozdzielczości 20 megapikseli.
Mamy zbudowaną maszynę, która może obsługiwać pojedynczy pulpit Win7 na wyświetlaczach w pełnej rozdzielczości i całkiem przyzwoite karty graficzne.
Moje pytanie brzmi: oprócz absurdalnej ilości pracy, jaką będą wykonywać moje moduły cieniujące piksele, czy istnieją jakieś inne ograniczenia DX10. *, Które mogłyby tu się pojawić, które nie byłyby w bardziej rozsądnym obszarze wyświetlania? Nie będę miał dostępu do sprzętu do przyszłego tygodnia, ale do tego czasu chciałbym napisać coś, czego mogę użyć do przetestowania systemu.
Aktualizacja
Chociaż Imanaged ma to działać na pojedynczym komputerze z wieloma kartami AMD EyeFinity (6 wyjść) - aby utrzymać płynność działania, „najłatwiejszym” sposobem było utworzenie okna DX na jeden ekran, ponieważ wyświetla się okno spowodowało pewne problemy z wydajnością - działałem też całkiem nieźle, rozdzielając zadanie na grupę komputerów, z których każdy obsługuje dwa wyświetlacze.
To było zaskakująco łatwe. Do mojej testowej aplikacji XNA dodałem GameComponent, który przechwytuje pewien stan gry (położenie kamery / orientacja itp.) I UDP-spamuje ją w lokalnej podsieci na ramkę.
Ten komponent ma Mode
przełącznik (wysyłanie lub odbieranie). Jeśli jest w Receive
trybie, przechwytuje datagramy UDP i aktualizuje stan gry o informacje od nadawcy. Send
Tryb po prostu wysyła pakiety stanu i za pośrednictwem usługi / demona powoduje, że węzły uruchamiają lub zatrzymują aplikację kliencką. Każdy klient może działać jako „master”, a przełączenie klienta w Send
tryb żąda przełączenia wszystkich innych węzłów Receive
. Zabawnie jest zobaczyć, co się dzieje, gdy ludzie walczą o kontrolę.
Kolejna fajna zaleta: stworzyłem aplikację konsolową, która przetwarza serię definicji stanu klatki kluczowej - lokalizację, czas itp. - interpoluje w razie potrzeby i wysyła je za pomocą tego samego kodu, który jest używany w silniku gry. To pozwala mi z łatwością wykonywać ruchy skryptowe, przesyłać transformacje z przeglądarki internetowej itp.
Podsumowując, synchronizacja wielu kopii aplikacji zajęła około 50 linii kodu. Dodatkowa złożoność wynikała z przesunięcia położenia kamery dla każdej maszyny i skorygowania pewnych niedogodności związanych z perspektywą / projekcją, ale większość z nich sprowadzała się do pliku konfiguracyjnego dla poszczególnych węzłów.
źródło
Odpowiedzi:
Martwiłbym się zarówno konfiguracją sprzętu, jak i oprogramowaniem. Nie musisz uruchamiać każdego telewizora w jego natywnej rozdzielczości, a rozmiar ekranu różni się od rozdzielczości. Zakładam, że 60-calowy telewizor ma rozdzielczość 1920 x 1080, więc natywna rozdzielczość dla wszystkich wynosi 9600 x 2160, jeśli chodziło o 5 rzędów x 2 kolumny telewizorów, lub 3840 x 5400, jeśli chodziło o 5 kolumn x 2 rzędy.
Najnowsza karta AMD Radeon, 7970, obsługuje rozdzielczość do 4096 x 2160 na ekran, maksymalnie dwa ekrany, jeśli używasz DisplayPort 1.2 do przesyłania wideo. Może więc zbliżyć się do rozdzielczości natywnej, jednak nie zadziała w ten sposób nawet z 5 telewizorami.
AMD Radeon 6870 Eyefinity 6 obsługuje do 6 wyjść jednocześnie, ale tylko w maksymalnej rozdzielczości 5760 x 2160. Obsługuje również konfigurację Crossfire, która znacznie poprawi Twoją wydajność. Pamiętaj, że dodatkowe procesory graficzne nie zapewniają większej maksymalnej rozdzielczości.
Poza całkowicie niestandardową konfiguracją wyświetlania lub czymś, co dzieli sygnał wideo na więcej monitorów / telewizorów, nie jestem pewien, jak będziesz w stanie działać na 10 ekranach jednocześnie. Ale jeśli masz taką możliwość, szukasz najszybszej konfiguracji graficznej, która obsługuje rozdzielczość najbliższą rozdzielczości natywnej. Gdy już to zrobisz, najlepszym rozwiązaniem jest utrzymanie możliwie najtańszych modułów cieniujących pikseli i unikanie przesadzania, co oznacza liczenie pojedynczych pikseli więcej niż jeden raz. Wycinanie zgrubień i okluzji oraz sortowanie głębokości znacznie przyczynią się do ograniczenia nadmiernego wyciągania. Jeśli chodzi o limit w DX10, nie jestem pewien, który ogranicza rozdzielczość, jestem pewien, że istnieje, ale prawdopodobnie jest większy niż jakakolwiek karta DX10, która istnieje.
źródło
Możesz łatwo utworzyć cel renderowania o równoważnym rozmiarze w celu przetestowania wydajności. Będziesz musiał przeskalować go w dół lub powiększyć podczas kopiowania do bufora tylnego, aż dostaniesz prawdziwy sprzęt.
źródło