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.