Czy wszystkie gry powstają poprzez narysowanie każdej klatki?

60

Jestem początkującym uczącym się animacji komputerowej (do gier). Jak dotąd jedyną metodą, na którą się natknąłem, jest rysowanie każdej klatki, każdej aktualizacji klatki. Tak więc na początku każdej klatki cała klatka jest usuwana, a następnie potrzebne są rzeczy, które są przerysowywane.

Moje pytanie brzmi, czy ta metoda jest jedyną, która jest używana do tworzenia animacji i gier. Wygląda na to, że jest to trochę nieefektywne. Nie do końca rozumiem też, jak ta metoda działałaby w grach 3D . Czy ktoś mógłby wyjaśnić to bardziej szczegółowo?

eeze
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Josh
John Carmack prawie wymyślił podejście na PC do przewijania ekranu na pełnym ekranie, rysując tylko cienki pionowy kawałek ekranu, który się zmienił. Komputery nie były w stanie wystarczająco szybko zaktualizować widoku pełnoekranowego bez tej techniki. Używał tego w wielu grach 2D na początku lat 90., takich jak Commander Keen. Przeczytaj „Masters of Doom”, aby uzyskać więcej informacji.
Ash

Odpowiedzi:

68

Bardzo stare gry używały techniki, w której przerysowywano tylko te części ramki, które zmieniły się w tej ramce. Co pamiętam, gra „Little Big Adventure” wykorzystuje tę technikę (1994). Ale widać, że gra przez większość czasu ma nieruchomą kamerę. scena zostanie przerysowana tylko wtedy, gdy wyjdziesz z widocznego obszaru. Jeśli grasz w tę grę, zauważysz również niewielkie opóźnienie w tej ramce. W nowoczesnych procesorach graficznych z nowoczesnymi silnikami gier sytuacja się zmieniła. Wszystko jest przerysowane na każdej ramce. W zależności od techniki renderowania rzeczy mogą być renderowane nawet kilka razy. Moc obliczeniowa GPU jest niewiarygodnie wysoka, jeśli używasz go poprawnie. Ale zdarza się ponowne użycie. Na przykład silnik może zdecydować o aktualizacji mapy cienia tylko co 5 klatkę. Lub oświetlenie nie jest aktualizowane, dopóki nie ma zmian w źródłach światła.

Arne
źródło
22
To nie tylko stare gry. W EA naciskano na zmniejszenie zużycia baterii laptopa w niektórych „zwykłych” grach, a jedną z technik było przerysowanie tylko części ekranu. Czasami można to zobaczyć w The Sims 3, jeśli kamera pozostanie nieruchoma, a karta SIM przeszła przez ekran, czasami pojawiał się błąd, w którym przerysowanie nie było wystarczająco duże, a piksele pozostawały w linii w poprzek ekran. Wystarczyło lekko przesunąć aparat, aby wymusić pełne przerysowanie, a linia zniknie.
Kevin Fee
12
Bardzo stary ... 1994 ... Teraz czuję się stary ...
podobnie
4
@alseether stare pod względem gier. Pamiętaj, że przeszliśmy od 8-bitowych plam pikselowych do fotorealizmu (w renderowanych przerywnikach, jeśli nie na żywo) w zaledwie 20 ~ 30 lat.
Jared Smith
16

Nie.

Przynajmniej jeśli dodasz stare gry z lat 70., w których korzystano z wyświetlaczy wektorowych.

Na przykład szeroko znana gra Asteroids, która została pierwotnie opracowana dla wyświetlaczy wektorowych, które są zasadniczo innym sposobem renderowania grafiki na ekranie.

Monitory wektorowe były również używane w niektórych grach arkadowych z końca lat 70. i połowy lat 80., takich jak Asteroidy, Burza i Gwiezdne Wojny. Atariuszuję pojęcie Quadrascan, aby opisać technologię stosowaną w arkadach gier wideo.

https://en.wikipedia.org/wiki/Vector_monitor

Nowoczesne grafiki są w 100% stworzone dla rasterizaton, który z definicji zapisuje zawartość bufora graficznego na wyświetlaczu każdej klatki.

Sandy Chapman
źródło
7
Wyświetlacze wektorowe nawet nie mają oczywiście „ramki”.
hobbs
2
@ Hobbs Prawidłowe, co sprawia, że ​​moja odpowiedź jest nadal poprawna, ponieważ odpowiedź na pytanie „Czy wszystkie gry powstają poprzez narysowanie każdej klatki?” to „Nie, nawet nie wszystkie gry rysują na podstawie ramek”.
Sandy Chapman
1
w głębszym sensie chodziło jednak o ciągłe rysowanie wszystkich widocznych elementów, nie tylko elementów, które się poruszają, a dla większości wyświetlaczy wektorowych odpowiedź brzmi „tak” (wyjątek stanowi tuba do przechowywania obrazów)
szulat
@szulat w sposób, który jest prawdziwy, ale żeby być uczciwym, nadal nie rysuje luk, w których wyświetlacz jest czarny. Odświeża tylko widoczne elementy na ekranie. Tj. W planetoidach, przerysowuje tylko statek i pozostałe planetoidy na ekranie.
Sandy Chapman
@SandyChapman i na innym poziomie, różnica jest naprawdę niewielka. gra aktualizuje pamięć ekranu lub duszki, gdy coś się zmienia. w przeciwnym razie odpowiednia część wyświetlacza pozostanie statyczna. dotyczy to zarówno systemów rastrowych, jak i wektorowych - „asteroidy” obsługują odświeżanie ekranu z pamięci ekranu (wektorowej!) bez przeszkadzania procesorowi, podobnie jak sprzęt widmowy zx generuje sygnał wideo rastrowego. niezależnie od tego, czy rzeczywista lub wyobrażona wiązka crt rysuje wielokąty, czy skanuje ekran w ustalonym wzorze, ma drugorzędne znaczenie.
szulat
11

Na najniższym poziomie procesor graficzny na twoim komputerze rzeczywiście obliczy każdą klatkę od podstaw i wyśle ​​ją na ekran. Będziesz jednak na to narażony, tylko jeśli sam poradzisz sobie z tymi niskopoziomowymi rzeczami [1]. Jednak każda grafika (a wraz z nią silnik gry) poradzi sobie z tymi rzeczami i możesz wyrazić scenę pod względem wielu elementów, które można modyfikować między ramkami, ale będą trwałe.

... jak ta metoda działałaby w grach 3D ...

Elementy w przestrzeni 3D są trwałe, silnik graficzny ponownie obliczy obraz na ekranie dla wszelkich dokonanych zmian (ruch kamery itp.)

[1] ... na przykład, jeśli piszesz własny silnik [2] z czymś takim jak OpenGL. Nawet w takim przypadku prawdopodobnie przechowujesz trwałe elementy między ramkami.

[2] Która nie jest opcją na twoim obecnym poziomie umiejętności.

TauCraft
źródło
Czy masz odniesienia do obsługi „procesor graficzny na twoim komputerze rzeczywiście obliczy każdą klatkę od podstaw”?
Kromster
@Kromster: To głównie kwestia wydajności. Ponieważ każda ramka może wymagać pełnego obliczenia, a nie wiadomo dokładnie, które części tego nie wymagają, konieczne byłoby kosztowne obliczenie, aby dokładnie określić, które bity można zapisać. Nawet gdyby był to wzrost wydajności netto, prowadziłby do niespójnych częstotliwości klatek.
MSalters
@MSalteruje sposób, w jaki jest wyrażony, zaprzecza wielu punktom w wielu odpowiedziach sąsiadów.
Kromster
Powiedziałbym, że stwierdzenie „procesor graficzny na twoim komputerze rzeczywiście oblicza każdą klatkę od podstaw” jest technicznie nieprawdziwe. GPU oblicza dokładnie to, co mu powiesz. Jeśli chcesz, aby używał poprzedniej klatki, to zrobi to (rzeczywiście, to jest domyślna). Wiele nowoczesnych silników gier (a nawet GUI systemu operacyjnego) decyduje się na rozpoczęcie od zera (gdzie poprzednia klatka jest wyświetlana tylko wtedy, gdy nowa klatka nie zakończyła renderowania w czasie), ale nie muszą.
Ove
Nie jestem nawet pewien, co stanowiłoby odniesienie do „ekran musi być wyczyszczony”, ale mam odniesienie do sposobu renderowania ramki w Doom: adriancourreges.com/blog/2016/09/09/doom-2016- studium grafiki ; nie zapominaj, że średnio zaawansowana karta graficzna powinna być w stanie zarządzać bilionami obliczeń na sekundę, kilkoma tysiącami na piksel.
pjc50
2

Krótka odpowiedź: nie

Długa historia:

Kiedy w szkole nauczyłem się programowania gier, nauczono nas:

Zdecyduj, jaką szybkość klatek na sekundę chcieliśmy w grze (na przykład 30).

Napisz kod, który dodaje 1 do licznika dla każdego interwału (33 ms dla 30 fps). Ten kod działa równolegle z pętlą gry.

Następnie pętla gry, która wykonuje obliczenia dla gry (aktualizacja stanu gry), zmniejszy ten sam licznik o 1 dla każdej klatki. Ale obliczenia graficzne i rysowanie na ekranie zostaną wykonane tylko wtedy, gdy licznik będzie wynosił zero.

Rezultat jest taki, że graficzna szybkość klatek dostosowuje się w zależności od tego, jak dobrze procesor obsługuje obliczenia w grze. Gdy w grze nie dzieje się zbyt wiele, obliczenia są łatwe, a liczba klatek na sekundę grafiki będzie wyższa niż faktyczna aktualizacja stanu gry (w zasadzie marnowanie cykli, ponieważ rysujemy ten sam stan gry więcej niż raz na ekranie).

Ale potem dużo się dzieje w grze, procesor będzie miał więcej do zrobienia, a aktualizacje stanu gry będą miały pierwszeństwo przed rysowaniem na ekranie.

Przez większość czasu gra będzie aktualizować się w zamierzonym tempie, ale będzie się wydawać „opóźniona”, ponieważ nie będzie widać każdej aktualizacji na ekranie. Może to być lepsze niż spowolnienie całej gry, ponieważ zmuszasz ją do losowania każdej aktualizacji na ekranie.

Wszystko to zostało wykonane w C ++, bez silnika gry ani karty graficznej. Wszystko działało na jednym rdzeniu procesora. Użyliśmy bibliotek do grafiki 2D.

użytkownik985366
źródło
1
Pamiętam grę „Golden Axe”. Podczas grania na 8086 rozgrywka była wolniejsza i znacznie łatwiejsza w obsłudze niż na 286, na przykład tam, gdzie rzeczy poruszały się szybciej. Po prostu dla ciebie.
akostadinov
0

Zanim będzie można stwierdzić, czy gry wideo „rysują” wyświetlanie każdej klatki, należy najpierw zdefiniować, co oznacza „rysować”. Z pewnością istnieje wiele gier wideo, z pewnością nie wszystkie rysują każdą klatkę, tworząc mapę bitową od zera; Rzeczywiście, wielu platformach nigdy zebrać pełne mapy bitowe w ogóle .

Istnieje kilka metod generowania wyświetlania przez gry wideo. Bardzo mała liczba ma procesor włączający i wyłączający wiązkę elektronów lub dla każdego piksela lub, w przypadku gier ze skanowaniem wektorowym, ustaw współrzędną XY każdej kropki do wykreślenia. Większość gier, które to robią, robi to głównie w celu wykazania, że ​​procesor jest wystarczająco szybki. Częściej gry będą miały sprzęt, który przy braku zaangażowania procesora wielokrotnie wyświetlałby pewien wzór pikseli lub wektorów. Ten wzorzec może być wytworzony przez sekwencyjny odczyt danych z regionu pamięci i interpretację każdego bitu lub grupy bitów jako koloru piksela (nazywa się to wyświetlaniem mapy bitowej). W niektórych przypadkach sprzęt może odczytać bajt pamięci dla każdego 8x8, 16x16, lub inny obszar wielkości wyświetlacza, a następnie użyj tego bajtu, aby wybrać zakres pamięci do odczytu dla danych pikseli (jest to często nazywane wyświetlaniem mapy znaków). Niektóre platformy sprzętowe mogą nakładać wiele ekranów bitmapowych z konfigurowalnymi pozycjami. Są to tak zwane duszki.

Niektóre platformy nie pozwalają na zmianę wzorca wyświetlania podczas wysyłania go na ekran, ale zamiast tego wymagają, aby wszystkie aktualizacje pojawiły się po zakończeniu rysowania jednej ramki przez belkę, ale przed rozpoczęciem rysowania następnej. Na takich platformach wszystko, co pojawi się na ramce, musi zostać załadowane do sprzętu wyświetlającego przed rozpoczęciem tej ramki, a wyświetlanie będzie ograniczone do pokazania wzorca, który można ustawić naraz. Gdyby procesor przestał działać podczas wyświetlania ramki, ta sama ramka byłaby pokazywana w nieskończoność. Inne platformy umożliwiają zmianę lub ponowną konfigurację wzoru podczas rysowania go na ekranie. Umożliwia to pokazanie ekranu, który jest o wiele bardziej skomplikowany niż sam obwód wideo.

Większość osobistych gier komputerowych używa sprzętu skonfigurowanego do rysowania pojedynczego ekranu bitmapy, a następnie rysowania na tym ekranie wszystkiego, co musi różnić się od tego, co już jest. Czasami może być łatwiej rysować rzeczy bez względu na to, czy jest to rzeczywiście konieczne w konkretnym przypadku, ale jeśli kod może łatwo stwierdzić, że nie ma powodu, aby część ekranu uległa zmianie, wydajność można poprawić, pomijając tę ​​część. Dzisiejsze platformy są często wystarczająco szybkie, aby w trakcie kadru mogły wielokrotnie rysować cały ekran, ale historycznie tak nie było. Na przykład najszybszy możliwy kod do zapisania wszystkich pikseli na ekranie wysokiej rozdzielczości komputera Apple II zająłby więcej niż dwie klatki, a najszybszy możliwy kod do skopiowania wszystkich pikseli na komputerze Apple II ” Ekran o wysokiej rozdzielczości z innego bufora zająłby dwa razy więcej. Uzyskanie dobrej wydajności wymagało, aby gry aktualizowały tylko rzeczy, które faktycznie się zmieniały, i to właśnie robiły dobre gry.

supercat
źródło
1
Dotarłem do połowy tej odpowiedzi i nie jestem pewien, jak to właściwie odpowiada na pytanie. Pierwszy akapit mówi o procesorach, współrzędnych XY, wiązkach elektronów, bajtach pamięci i duszkach - ale żaden z nich nie dotyczy widocznego rysowania każdej klatki. Drugi akapit mówi o wzorcach wyświetlania, a potem mnie traci. Myślę, że musisz wziąć pod uwagę wszystko, co jest związane z przerysowaniem ekranu, umieścić go na szczycie w jasnym zestawieniu, a następnie połączyć wszystko inne, o czym musisz porozmawiać, aby wyjaśnić, co się dzieje.
doppelgreener
1
@doppelgreener: Pojęcie „rysowania” każdej klatki jest nieco niejasne. Coś musi zrobić wszystko, co konieczne, aby wygenerować każdą ramkę, ale istnieje wiele sposobów, na które można podzielić pracę procesora i sprzętu. Niektóre sposoby wymagają, aby procesor był zaangażowany w każdą ramkę, nawet w częściach ekranu, które wyglądają tak samo między kolejnymi ramkami, podczas gdy inne nie. Podczas gdy jakakolwiek gra LCD lub CRT będzie ostatecznie wymagać, aby coś wyświetlało każdą niepustą ramkę [gry wykorzystujące papier elektroniczny lub wyświetlacze typu flip-dot] mogą nie być], niezbędne działania mogą, ale nie muszą być uważane za „rysowanie”.
supercat
Proponuję zacząć od prostego języka (czy ciągle „rysujemy ramę”) i wrócić od tego, wyjaśniając więcej technicznych szczegółów dotyczących tego, dlaczego to może nie być dokładny sposób ujęcia - zamiast zagłębiać się w szczegóły . Twój post wymaga zasadniczo streszczenia i wprowadzenia, zanim zaczniesz badać rzeczy dogłębnie.
doppelgreener
-11

Krótko mówiąc, powiedziałbym, że nie wszystkie ramki są narysowane, ale tylko te, które są wymagane do przedstawienia twojej historii lub tematu gry lub rozgrywki. Ponadto liczy się czas, w którym w określonych przypadkach chcesz się zdarzyć.

Sakib Zang
źródło
9
Nie ma to nawet sensu w stosunku do zadanego pytania. Myślę, że pomyliłeś „ramkę” z czymś innym… czy może mylisz się z elementami planszy opowieści? OP mówi konkretnie o ramkach w kontekście renderowania
Trotski94,