W jaki sposób urządzenia takie jak Game Boy Advance osiągają liczbę klatek na sekundę?

31

Projektuję własne przenośne urządzenie do gier oparte na mikrokontrolerze AVR i małym wyświetlaczu OLED.

Zacząłem od monochromatycznego wyświetlacza 128 x 64 pikseli i mogę wygodnie rysować z prędkością ponad 60 klatek na sekundę.

Niedawno przerobiłem go, aby używał RGB OLED, 128 x 128 pikseli, nie myśląc zbyt wiele, by znaleźć tylko 4 FPS. Po kilku przemyśleniach i starannej refaktoryzacji mogę uzyskać do ~ 12 kl./s, jeśli nie przejmuję się zbytnio robieniem czegoś innego!

Moje pytanie brzmi - w jaki sposób urządzenie takie jak GBA (Game Boy Advance) osiągnęło częstotliwość klatek wynoszącą prawie 60 klatek na sekundę? Pomyślałem o oddzielnym „procesorze graficznym”, ale zdałem sobie sprawę, że nadal będę miał wąskie gardło w przenoszeniu do tego danych wyświetlanych.

Zastanawiałem się również nad użyciem oryginalnego 8-bitowego interfejsu równoległego, który ma większość tych ekranów, co może przynieść mi 8-krotne przyspieszenie, z tym wyjątkiem, że współczesne MCU nie mają zwykle sprzętowych interfejsów równoległych, jak w przypadku szeregowego i bitowego walenie prawdopodobnie pochłonie dużą część prędkości.

Jakie są inne opcje?

Obecnie używam ATmega1284P podłączonego do kontrolera OLD SSD1306 przez USART-SPI. To jest wersja monochromatyczna.

Kolorowy ekran to SSD1351, pierwotnie niepołączony ze sprzętowym interfejsem SPI. Nie byłem przekonany, że to zrobi wystarczającą różnicę, ogólnie jest to po prostu zbyt powolne

Wiem, że mogę uzyskać szybsze MCU, ale chcę wiedzieć, jakie inne opcje mogę zbadać - procesor GBA jest znacznie wolniejszy niż mój 1284!

MalphasWats
źródło
6
„Nadal miałbym wąskie gardło, przenosząc do tego dane wyświetlane”. DSI ma cztery tory do 1,2 Gb / s. Resztę obliczeń pozostawiam tobie.
Oldfart,
1
Podobnie jak każda grafika w dowolnym urządzeniu do gier wideo, istnieje pamięć, która poradziłaby sobie z grafiką. Według tej strony internetowej znajduje się adres do grafiki, dźwięku itp. Instrukcje będą tam przechowywane. Zakładając, że nie ma zbyt wielu danych, które mogłyby powodować konflikty z czasem wydajności, uruchomiłby te instrukcje, aby z łatwością załadować dane graficzne.
KingDuken,
5
kup wyświetlacz bez kontrolera i stwórz własny kontroler
old_timer
4
@immibis: Niemal na pewno jakiś okropny kontroler oparty na I2C lub SPI. Rzeczy hobbystów pełne są drogich, powolnych rzeczy, takich jak ten, w którym można uzyskać ekran iPhone'a o rozdzielczości 400+ dpi za 20 USD ze względu na korzyści skali.
R ..
6
@R .. Chciałbym tylko podkreślić, że powodem tych hobbistycznych kontrolerów jest to, że mogą one współpracować z prawie każdym procesorem, ponieważ brzmi to tak, jakby były bezużyteczne. W ogóle nie byłbyś w stanie łatwo połączyć się z ekranem iPhone'a. Prawdopodobnie łączy się z dedykowanym i być może niestandardowym procesorem graficznym.
user253751,

Odpowiedzi:

64

Inne odpowiedzi dość dobrze pokrywają twoje pytanie na poziomie abstrakcyjnym (sprzętowym), ale mając faktyczne doświadczenie z GBA, pomyślałem, że bardziej szczegółowe wyjaśnienie może być warte zachodu.

GBA miał wiele trybów rysowania i ustawień, które można wykorzystać do kontrolowania interpretacji pamięci RAM przez procesor graficzny, ale jedno jest nieuniknione: szybkość klatek. Procesor graficzny rysował na ekranie w prawie (więcej na ten temat poniżej) stałej pętli. (Jest to prawdopodobnie najbardziej odpowiedni bit dla twojego pytania).

Rysowałby jedną linię na raz, robiąc bardzo krótką przerwę między nimi. Po narysowaniu ostatniej linii dla ramki zajęłoby to przerwę w przybliżeniu równą czasowi, który zajmuje narysowanie 30 linii. Następnie zacznij od nowa. Czas każdej linii i czas każdej ramy zostały z góry określone i osadzone w kamieniu. Pod wieloma względami procesor graficzny był tak naprawdę mistrzem tego systemu i trzeba było pisać gry wokół jego zachowania, ponieważ kontynuowałoby to, co robił, niezależnie od tego, czy byłeś gotowy.

Około 75-80% czasu aktywnie naciskało na ekran. Jakie liczby klatek można osiągnąć, jeśli robisz to samo?

To 80% czasu było również tym, co CPU musiał przetwarzać przez użytkownika, obliczać stan gry i ładować duszki / kafelki do obszarów VRAM, które były obecnie poza ekranem (lub przynajmniej nie były uwzględnione w rysowanej linii).

20% między klatkami to tyle, ile procesor musiał dostosować ustawienia wideo lub pamięci RAM, które wpłynęłyby na całą następną klatkę.

Na końcu każdej linii procesor graficzny wyśle ​​do procesora przerwanie synchronizacji linii. Przerwania tego można użyć do dostosowania ustawień kilku duszków lub kilku warstw tła (w ten sposób można uzyskać efekt przypominający stożkowe światło punktowe, zmieniając rozmiar i położenie jednej z prostokątnych masek między każdą narysowaną linią. jeśli chodzi o sprzęt, wszystkie te regiony są prostokątne). Trzeba uważać, aby te aktualizacje były małe i zakończyć, zanim procesor graficzny zacznie rysować kolejną linię, aby uzyskać brzydkie wyniki. Każdy czas spędzony na przetwarzaniu tych przerwań skraca również 80% czasu przetwarzania procesora ...

W przypadku gier, które w pełni wykorzystały ten system, ani procesor, ani procesor graficzny nigdy nie zrobiły prawdziwej przerwy; obaj gonili się nawzajem po pętli, aktualizując to, czego nie oglądał obecnie drugi.

Mr.Mindor
źródło
5
Witaj i dobrze mówiąc.
Mindwin
2
Niektóre „nowsze” systemy, takie jak Nintendo DS, ominęły ustalone ograniczenie liczby klatek na sekundę, dodając rejestr VCOUNT, aby opóźnić kolejną klatkę o konfigurowalny czas (zwykle w celu synchronizacji gier wieloosobowych).
las,
21

Kluczową cechą wszystkich konsol do gier, które odróżniały je od wczesnych komputerów PC i praktycznie wszystkich komputerów domowych (1), były sprity sprzętowe .

Połączony przewodnik programowania GBA pokazuje, jak działają z punktu widzenia głównego procesora. Mapy bitowe reprezentujące gracza, tło, wrogów itp. Są ładowane do jednego obszaru pamięci. Inny obszar pamięci określa lokalizację duszków. Zamiast więc ponownie zapisywać całą pamięć RAM wideo w każdej klatce, co wymaga wielu instrukcji, procesor musi po prostu zaktualizować lokalizację duszków.

Procesor wideo może następnie pracować piksel po pikselu, aby określić, który duszek ma rysować w tym punkcie.

Wymaga to jednak podwójnej pamięci RAM współdzielonej między nimi i myślę, że w GBA procesor wideo jest na tym samym układzie co główny procesor ARM i dodatkowy procesor Z80.

(1) Godny uwagi wyjątek: Amiga

pjc50
źródło
Tylko nit - naprawdę wczesne gry zręcznościowe miały sprite'y w pamięci ROM związanej z procesorem graficznym, a nie w dwuportowej pamięci RAM. Nie mam pojęcia, czy tak było również w przypadku wczesnych konsol, chociaż z pewnością można to zrobić w ten sposób.
TimWescott,
@TimWescott GBA miało wiele trybów rysowania i nie mam doświadczenia z większością, więc może nie być to ogólnie prawda, ale nie sądzę, aby którykolwiek z tych trybów miał bezpośredni dostęp do ROMów (na kasecie): Zazwyczaj wszystkie dane kafelka / duszka / palety musiały zostać przeniesione z pamięci ROM do pamięci wideo i stamtąd działał na nim procesor graficzny.
Mr.Mindor,
@ Mr.Mindor Przepraszam, jeśli nie byłem jasny - nie udaję, że wiem, jak to zrobili GB lub GBA. Właśnie komentując bardzo wczesnych gier Nintendo zręcznościowa z powrotem w latach 70-tych i na początku 80-tych, który miał nas wszystkich zastanawiać, jak w h *** oni zrobili to.
TimWescott,
@TimWescott: Myślę, że to samo dotyczy NES, chociaż ROM, o którym mowa, znajduje się w Game Paks.
supercat
19

„Moje pytanie brzmi - w jaki sposób urządzenie takie jak GBA osiągnęło częstotliwość klatek prawie 60 kl./s?”

Aby odpowiedzieć tylko na pytanie, zrobili to za pomocą procesora graficznego. Jestem pewien, że Game Boy używał grafiki sprite. Na najwyższym poziomie oznacza to, że procesor graficzny wczytuje rzeczy takie jak obraz tła, obraz Mario, obraz Princess Peach itp. Następnie główny procesor wydaje polecenia takie jak „pokaż przesunięcie tła przez to dużo na xiy, nakładka obrazu Mario nr 3 na tę pozycję x, y ”itd. Tak więc główny procesor absolutnie nie zajmuje się rysowaniem każdego piksela, a procesor graficzny absolutnie pozytywnie nie zajmuje się obliczaniem stanu gra. Każda jest zoptymalizowana pod kątem tego, co musi zrobić, a wynikiem jest całkiem dobra gra wideo bez użycia dużej mocy obliczeniowej.

TimWescott
źródło
7
Nazywanie go „procesorem graficznym” przesadza z tym, co robi, co sugeruje, że jest to jakiś własny procesor. To tylko kontroler wideo, który jest w zasadzie skomplikowanym rodzajem sekwencera. Gdy zlicza piksele poziome i pionowe, pobiera dane tytułu i / lub duszka, umieszcza je w rejestrach przesuwnych i łączy dane wyjściowe rejestrów przesuwnych w piksel wyjściowy. Nie jest w stanie uruchomić programu takiego jak procesor graficzny „GPU”.
Ross Ridge,
14

GBA miał dość wolny procesor. ARM7 jest bardzo fajny; po prostu uruchomili go powoli i nie dali prawie żadnych zasobów.

Jest powód, dla którego wiele gier Nintendo w tym momencie i wcześniej było side-scrollerami. SPRZĘT KOMPUTEROWY. Wszystko odbywa się sprzętowo. Miałeś wiele warstw kafelków i co najmniej jedną duszkę, a sprzęt wykonał całą pracę, aby wyodrębnić piksele z tych tabel i sterować wyświetlaniem.

Zbudujesz zestaw kafelków z przodu, a następnie będziesz miał niewielką pamięć, która była mapą kafelków. Chcesz, aby dolna lewa płytka była płytką 7? Umieszczasz 7 w tym miejscu pamięci. Chcesz, aby następnym kafelkiem był kafelek 19? W zestawie kafelków umieścisz tam 19 itd. Dla każdej włączonej warstwy. W przypadku duszka po prostu ustaw adres x / y. Możesz także skalować i obracać, ustawiając niektóre rejestry, a sprzęt zajmie się resztą.

Tryb 7, jeśli dobrze pamiętam, był trybem pikselowym, ale to było jak tradycyjna karta wideo, w której umieszcza się bajty w tej pokrywie koloru piksela, a sprzęt zajmuje się odświeżaniem wideo. Myślę, że możesz pingować ponga, a przynajmniej kiedy masz nową ramkę, możesz je przerzucić, ale nie pamiętam dobrze. Ponownie procesor był dość podkręcony w tym dniu i wieku i nie miał zbyt wielu szybkich zasobów. Podczas gdy niektóre gry były w trybie 7, wiele z nich to side-scrollery oparte na kafelkach ...

Jeśli chcesz mieć rozwiązanie o wysokiej liczbie klatek na sekundę, musisz je zaprojektować. Nie możesz po prostu wziąć żadnego starego wyświetlanego ekranu i porozmawiać z nim przez SPI lub I²C lub coś w tym rodzaju. Umieść przed sobą co najmniej jeden bufor ramki, najlepiej dwa, i kontroluj wiersze i kolumny, jeśli to możliwe, na tym ekranie.

Pewna liczba wyświetlaczy, które, jak podejrzewam, kupujesz, ma kontroler, z którym rozmawiasz. Jeśli chcesz wydajności typu GBA / konsoli, tworzysz / implementujesz kontroler. Lub kupujesz / budujesz z GPU / układem wideo / blokiem logicznym i używasz HDMI lub innego wspólnego interfejsu do standardowego monitora.

To, że rower ma opony, łańcuch i biegi, nie oznacza, że ​​może jechać tak szybko, jak motocykl. Musisz zaprojektować system tak, aby spełniał Twoje wymagania dotyczące wydajności od początku do końca. Możesz umieścić to koło rowerowe na tym motocyklu, ale nie będzie ono działać zgodnie z oczekiwaniami; wszystkie elementy muszą być częścią ogólnego projektu.

Asteroidy też działały w ten sposób; potrzebował tylko jednego 6502. Grafika wektorowa została wykonana z osobną logiką; 6502 wysłał niewielki ciąg danych do kontrolera grafiki wektorowej, który użył pamięci ROM i tych danych do sporządzenia wykresu xy wiązki i z, włączanie / wyłączanie ... Niektóre stacje miały oddzielne procesory do obsługi audio i wideo oddzielnie od procesor obliczający grę. Oczywiście dzisiaj wideo jest obsługiwane przez setki, jeśli nie tysiące procesorów, które są oddzielone od głównego procesora ...

old_timer
źródło
Przysięgam, że pamiętam, że tryb 7 został stworzony przez marketing jako odpowiedź na „hiper tryb” Segi czy coś… może „Super FX?” en.wikipedia.org/wiki/Mode_7
Caleb Jay
coranac.com/tonc/text/bitmaps.htm#sec-modes Mogłem to źle zapamiętać Mam na myśli tryb 5 lub jeden z trybów bitmapowych, są też tryby kafelkowe ze spritami i trybem lub trybami buforowania klatek . być może 7. nie wiedziałeś o tym, który połączyłeś, ale to dobrze wiedzieć.
old_timer
hmm czytam więcej o trybie 7 i to nie tylko tryb. W każdym razie GBA ma tryby kafelkowe i tryby bitmapowe, które są wolniejsze, ponieważ musisz być odpowiedzialny za każdy piksel, w którym tryby kafelkowe jeden bajt na mapie kafelkowej wytwarzają wiele pikseli. Wykorzystali również rozmiar magistrali (szerokość) i szybkość pamięci, a także pamięć podręczną potoku ROM, aby nieco szybciej wydostać się z instrukcji (ROM). Ale od pierwszego dnia miałeś problemy z uruchomieniem oprogramowania w przyzwoitym tempie i na szczęście logika zajęła się większością prac wideo.
old_timer,
jeśli spojrzysz na te ekrany, które kupujesz, które mają te równoległe 8-bitowe lub 4-bitowe interfejsy spi lub i2c, które są na twojej drodze do wydajności, chcesz surowy wyświetlacz bez tych kontrolerów, a następnie możesz kontrolować, w jaki sposób wyświetlacz jest zarządzany , zbuduj bufor bufora ramki lub dwa, abyś mógł pingować / pongować i szybki interfejs między procesorem a buforem ramki. zakładając, że zaczynasz od wystarczająco szybkiego wyświetlania.
old_timer,
7

w jaki sposób urządzenie takie jak GBA osiągnęło częstotliwość klatek wynoszącą prawie 60 klatek na sekundę?

Sprzęt komputerowy.

Ma pamięć graficzną, która może, ale nie musi, dzielić tę samą magistralę co pamięć programu / danych ... ale ważne jest to, że ma procesor graficzny, który odczytuje pamięć 60 razy na sekundę i wysyła dane do LCD za pomocą zoptymalizowany interfejs, który został zaprojektowany tak, aby efektywnie to robić.

Możesz zrobić to samo z dowolnym nowoczesnym mikrokontrolerem wyposażonym w urządzenie peryferyjne z „interfejsem LCD”, na przykład LPC4330, chociaż może to być przesada. Oczywiście potrzebujesz kompatybilnego panelu LCD.

Dzięki nowoczesnym szybkim mikrokontrolerom (tj. ARM nie AVR) i tak małemu ekranowi prawdopodobnie nie będziesz potrzebował sprite'ów ani blittera, aby przyspieszyć operacje graficzne. W przypadku 8-bitowego AVR może to być powolne.

Ale bez względu na procesor, bit walenie interfejsu do wyświetlacza będzie do bani.

Wydaje mi się, że Atari 2600 wykorzystywał procesor bittingu do wysyłania obrazu do telewizora. To jest trochę przestarzałe.

peufeu
źródło
Nawet 2600 miał sprity sprzętowe, choć bardzo ograniczona liczba (myślę, że dwóch graczy i dwie kule)
pjc50,
2
@ pjc50, rodzaj Atari 2600 miał sprzętowe duszki. Jak każda inna część podsystemu graficznego były to obiekty jednowymiarowe. Jeśli programista chciał czegoś innego niż zestaw linii pionowych, program musiał zaktualizować duszki po narysowaniu każdego rzędu na ekranie.
Mark
1
@Mark: 2600 zdecydowanie miał sprity sprzętowe. Sprzęt sterował tylko pozycjonowaniem poziomym, ale duszki na 2600 umożliwiły produkowanie gier, które były znacznie bardziej kolorowe niż którykolwiek z jego konkurentów.
supercat