Tutti i giochi sono realizzati disegnando ogni fotogramma?


60

Sono un principiante che impara a conoscere l'animazione al computer (per i giochi). Finora, l'unico metodo che ho incontrato è disegnare ogni frame, ogni aggiornamento del frame. Quindi all'inizio di ogni fotogramma, l'intero fotogramma viene cancellato e quindi le cose necessarie per quel fotogramma vengono ridisegnate.

La mia domanda è se questo metodo sia o meno l'unico che viene utilizzato per realizzare animazioni e giochi. Sembra che sia un po 'inefficiente. Inoltre non capisco bene come funzionerebbe questo metodo per i giochi 3d . Qualcuno potrebbe spiegare questo in modo più dettagliato?


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Josh

John Carmack ha quasi inventato l'approccio su PC per eseguire lo scorrimento laterale a schermo intero disegnando solo la sottile porzione verticale dello schermo che è cambiata. I PC non erano semplicemente in grado di aggiornare la visualizzazione a schermo intero abbastanza velocemente senza questa tecnica. Lo ha usato in molti giochi 2D nei primi anni '90 come il comandante Keen. Leggi "Masters of Doom" per maggiori informazioni.
Ash,

Risposte:


68

I giochi molto vecchi utilizzavano una tecnica in cui venivano ridisegnate solo quelle parti di un fotogramma che cambiavano su quel fotogramma. Quello che posso ricordare, il gioco "Little Big Adventure" utilizza questa tecnica (1994). Ma puoi vedere che il gioco ha per la maggior parte del tempo una videocamera statica. solo quando ti sposti dall'area visibile la scena viene ridisegnata. Se giochi, noteresti anche un piccolo ritardo su quel fotogramma. Nelle GPU moderne con moderni motori di gioco, le cose sono cambiate. Tutto è ridisegnato su ogni fotogramma. A seconda della tecnica di rendering, le cose potrebbero anche essere rese più volte. La potenza di calcolo di una GPU è incredibilmente alta quando la si utilizza correttamente. Ma il riutilizzo sta accadendo. Ad esempio un motore potrebbe decidere di aggiornare la mappa ombra solo ogni 5 fotogrammi. Oppure l'illuminazione non viene aggiornata purché non vi siano variazioni nelle fonti luminose.


23
Non sono solo vecchi giochi. In EA, c'è stata una spinta per ridurre l'utilizzo della batteria del laptop per alcuni giochi "casuali", e una tecnica era quella di ridisegnare solo parti dello schermo. A volte potresti vederlo in The Sims 3 se lasciassi la fotocamera ferma e un sim attraversasse lo schermo, a volte ci sarebbe stato un bug in cui il ridisegno non era abbastanza grande e vedevi pixel lasciati indietro in una linea attraverso il schermo. Devi solo spostare leggermente la fotocamera per forzare un ridisegno completo e la linea scomparirebbe.
Kevin Fee

12
Molto vecchio ... 1994 ... Adesso mi sento vecchio ...
se

4
@alseether old in termini di gioco. Ricorda che siamo passati dai BLOB di pixel a 8 bit al fotorealismo (in scene pre-renderizzate se non in live action) in soli 20 ~ 30 anni.
Jared Smith,

16

No.

Almeno se includi vecchi giochi degli anni '70 che utilizzavano schermi vettoriali.

Ad esempio, il noto gioco Asteroids, originariamente sviluppato per display vettoriali che sono un modo fondamentalmente diverso di rendere la grafica su uno schermo.

I monitor vettoriali sono stati utilizzati anche da alcuni giochi arcade di fine anni '70 e '80 come Asteroids, Tempest e Star Wars. Atari ha usato il termine Quadrascan per descrivere la tecnologia quando usata nei loro portici di videogiochi.

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

La grafica moderna è praticamente realizzata al 100% per rasterizzazione, che per definizione scrive il contenuto di un buffer grafico sul display ogni fotogramma.


7
I display vettoriali non hanno nemmeno ovviamente una "cornice".
Hobbs

2
@hobbs Corretto, il che rende la mia risposta ancora corretta poiché la risposta a "Tutti i giochi sono realizzati disegnando ogni fotogramma?" è "No, nemmeno tutti i giochi disegnano in base ai frame".
Sandy Chapman,

1
tuttavia, in un senso più profondo, la domanda era di disegnare ripetutamente tutti gli oggetti visibili, non solo quelli che si muovono, e per la maggior parte dei display vettoriali la risposta è ancora "sì" (il tubo di memorizzazione delle immagini sarebbe un'eccezione)
szulat

@szulat in un modo vero, ma per essere onesti, non disegna ancora negli spazi in cui il display è nero. Aggiorna solo gli elementi visibili sullo schermo. Vale a dire in Asteroids, sta solo ridisegnando la nave e gli asteroidi rimanenti sullo schermo.
Sandy Chapman,

@SandyChapman e ad un altro livello, c'è davvero poca differenza. un gioco aggiorna la memoria dello schermo o sprite quando qualcosa cambia. altrimenti la parte corrispondente del display rimane statica. questo vale sia per i sistemi raster che per quelli vettoriali: gli "asteroidi" gestiscono l'aggiornamento dello schermo dalla memoria dello schermo (vettoriale!) senza disturbare la CPU, allo stesso modo in cui l'hardware dello spettro zx genera il suo segnale video raster. se il raggio crt reale o immaginario stia disegnando poligoni o scansionando lo schermo secondo uno schema fisso, è secondario.
szulat,

11

Al livello più basso, il processore grafico sul tuo computer calcolerà effettivamente ogni fotogramma da zero e lo invierà sullo schermo. Sarai esposto a questo, tuttavia, se gestirai tu stesso queste cose di basso livello [1] Qualsiasi motore grafico (e con questo, gioco-) comunque gestirà queste cose per te e sei libero di esprimere la scena in termini di molte entità che è possibile modificare tra i frame, ma sarà persistente.

... come funzionerebbe questo metodo per i giochi 3d ...

Gli elementi nello spazio 3D sono persistenti, il motore grafico dovrebbe, nuovamente, ricalcolare l'immagine sullo schermo per eventuali modifiche (movimento della fotocamera, ecc.)

[1] ... ad esempio se scrivi il tuo motore [2] con qualcosa come OpenGL. Anche in quel caso probabilmente memorizzeresti cose persistenti tra i frame.

[2] Che non è un'opzione al tuo attuale livello di abilità.


Hai riferimenti a supporto "il processore grafico sulla tua macchina calcolerà effettivamente ogni frame da zero"?
Kromster dice che supporta Monica

@Kromster: è principalmente una questione di efficienza. Poiché ogni fotogramma potrebbe richiedere un calcolo completo ed è incerto esattamente quali parti non lo facciano, sarebbe necessario un calcolo costoso per determinare esattamente quali bit potrebbero essere salvati. Anche se si tratterebbe di un miglioramento delle prestazioni nette, porterebbe a frame rate incoerenti.
MSalters

@MSalters nel modo in cui è espresso, contraddice molti punti nelle risposte di molti vicini.
Kromster dice di sostenere Monica il

Direi che l'affermazione "il processore grafico sul tuo computer calcolerà davvero ogni frame da zero" è tecnicamente falso. La GPU calcola esattamente ciò che dici. Se vuoi che riutilizzi il fotogramma precedente, lo farà (in effetti, questo è il suo valore predefinito). Molti motori di gioco moderni (e persino GUI del sistema operativo) scelgono di iniziare da zero (in cui il frame precedente viene mostrato solo se il nuovo frame non ha terminato il rendering in tempo), ma non è necessario.
Ove

Non sono nemmeno sicuro di cosa costituisca un riferimento per "lo schermo deve essere cancellato", ma ho un riferimento su come viene eseguito il rendering di un frame in Doom: adriancourreges.com/blog/2016/09/09/doom-2016- studio grafico ; non dimenticare che una scheda grafica di fascia media dovrebbe essere in grado di gestire un trilione di calcoli al secondo, diverse migliaia per pixel.
pjc50,

2

Risposta breve: No.

Lunga storia:

Quando ho imparato alcuni programmi di gioco a scuola, ci hanno insegnato a fare quanto segue:

Decidi quale frequenza di fps desideriamo nel gioco (ad esempio 30).

Scrivi del codice che aggiunge 1 a un contatore per ogni intervallo (33 msec per 30 fps). Questo codice viene eseguito contemporaneamente al ciclo di gioco.

Quindi il loop di gioco che esegue i calcoli per il gioco (aggiornamento dello stato del gioco) ridurrà lo stesso segnalino di 1 per ciascun fotogramma. Ma i calcoli grafici e il disegno sullo schermo verranno eseguiti solo se il contatore è a zero.

Il risultato è che la frequenza dei fotogrammi grafica si adatterà in base alla capacità della CPU di gestire i calcoli nel gioco. Quando non accade troppo nel gioco, i calcoli sono facili e la frequenza dei fotogrammi grafica sarà superiore all'aggiornamento dello stato del gioco effettivo (sostanzialmente sprecando cicli poiché disegniamo lo stesso stato del gioco più di una volta sullo schermo).

Ma poi sta accadendo molto nel gioco, la CPU avrà più lavoro da fare e gli aggiornamenti dello stato del gioco avranno la priorità rispetto al disegno sullo schermo.

Il più delle volte, il gioco continuerà ad aggiornarsi alla velocità prevista, ma apparirà "lento" poiché non vedrai ogni aggiornamento sullo schermo. Questo può essere preferibile al rallentamento dell'intero gioco perché lo costringi a disegnare ogni aggiornamento sullo schermo.

Tutto ciò è stato fatto con C ++ e nessun motore di gioco, né scheda grafica. Tutto ha funzionato su un singolo core CPU. Abbiamo usato alcune librerie per la grafica 2D.


1
Ricordo il gioco "Ascia d'oro". Quando giocato su 8086, il gioco era più lento e molto più facile da gestire rispetto al 286, ad esempio quando le cose si muovevano più velocemente. Cordiali saluti.
Akostadinov,

0

Prima di poter dire se i videogiochi "disegnano" la visualizzazione di ogni fotogramma, è innanzitutto necessario definire cosa si intende per "disegnare". Esistono sicuramente molti videogiochi che non tutti disegnano ogni fotogramma assemblando una bitmap da zero; infatti, molte piattaforme di gioco mai assemblare bitmap completo a tutti .

Ci sono alcuni approcci che i videogiochi possono adottare per generare un display. Un numero molto piccolo ha la CPU per accendere e spegnere il fascio di elettroni o per ogni pixel o, per i giochi a scansione vettoriale, impostare le coordinate XY di ogni punto da tracciare. La maggior parte dei giochi che lo fanno lo fanno in gran parte allo scopo di dimostrare che la CPU è abbastanza veloce. Più comunemente i giochi avranno hardware che, in assenza del coinvolgimento della CPU, produrrà ripetutamente alcuni pattern di pixel o vettori sul display. Questo modello può essere prodotto leggendo i dati in sequenza da una regione di memoria e interpretando ogni bit o gruppo di bit come un colore di pixel (questo è chiamato un display bitmap). In alcuni casi, l'hardware può leggere un byte di memoria per ogni 8x8, 16x16, o un'altra area di dimensioni del display e quindi utilizzare quel byte per selezionare un intervallo di memoria da leggere per i dati pixel (questo è spesso chiamato un display della mappa dei caratteri). Alcune piattaforme hardware possono sovrapporre più display bitmap con posizioni configurabili. Questi sono indicati come sprite.

Alcune piattaforme non consentono di modificare il motivo di visualizzazione mentre viene inviato allo schermo, ma richiedono invece che tutti gli aggiornamenti avvengano dopo che il raggio ha finito di disegnare un fotogramma ma prima che abbia iniziato a disegnare il successivo. Su tali piattaforme, tutto ciò che apparirà su un frame deve essere caricato nell'hardware del display prima dell'inizio di quel frame, e il display si limiterà a mostrare un pattern che può essere impostato tutto in una volta. Se la CPU smettesse di funzionare mentre viene mostrato il frame, quello stesso frame continuerebbe ad essere mostrato indefinitamente. Altre piattaforme consentono di modificare o riconfigurare il motivo mentre viene disegnato sullo schermo. Ciò consente di mostrare uno schermo che è molto più complicato di quanto il circuito video possa gestire da solo.

La maggior parte dei giochi per personal computer utilizza l'hardware configurato per disegnare una singola schermata bitmap, quindi disegnare su quella schermata tutto ciò che deve essere diverso da ciò che è già lì. A volte può essere più semplice disegnare cose senza considerare se sia effettivamente necessario in un caso particolare, ma se il codice può facilmente dire che non c'è motivo per cambiare parte dello schermo, è possibile migliorare le prestazioni saltando quella parte. Le piattaforme odierne sono spesso abbastanza veloci da poter disegnare l'intero schermo più volte nel corso di un frame, ma storicamente non era così. Il codice più veloce possibile per scrivere tutti i pixel sullo schermo ad alta risoluzione del computer Apple II, ad esempio, richiederebbe più di due frame e il codice più veloce possibile per copiare tutti i pixel sul computer Apple II " Lo schermo ad alta risoluzione di un altro buffer richiederebbe il doppio. Ottenere buone prestazioni richiedeva che i giochi aggiornassero solo le cose che stavano effettivamente cambiando, ed è quello che generalmente facevano i buoni giochi.


1
Ho raggiunto a metà questa risposta e non sono sicuro di come stia effettivamente rispondendo alla domanda. Il tuo primo paragrafo parla di CPU, coordinate XY, fasci di elettroni, byte di memoria e sprite, ma nulla di tutto ciò riguarda visibilmente il disegno di ciascun frame. Il secondo paragrafo parla a lungo degli schemi di visualizzazione, e poi mi perde. Penso che tu debba prendere qualsiasi parte di ciò che riguarda il ridisegno dello schermo, metterlo in cima in una dichiarazione chiara e quindi collegare qualsiasi altra cosa di cui hai bisogno per parlare di nuovo per spiegare cosa sta succedendo.
doppelgreener,

1
@doppelgreener: l'idea di "disegnare" ogni fotogramma è un po 'vaga. Qualcosa deve fare tutto il necessario per generare ogni frame, ma ci sono molti modi in cui il lavoro può essere diviso per CPU e hardware. Alcuni modi richiedono che la CPU sia coinvolta su ogni frame anche con parti dello schermo che appaiono uguali tra un frame e il successivo, mentre altri no. Mentre qualsiasi gioco LCD o CRT alla fine richiederà che qualcosa emetta ogni fotogramma non vuoto [i giochi che usano display E-paper o flip-dot potrebbero non essere], le azioni necessarie possono o non possono essere considerate "disegno".
supercat

Ti suggerisco di iniziare con un linguaggio semplice (indipendentemente dal fatto che "disegniamo una cornice" costantemente) e di tornare da lì spiegando maggiori dettagli tecnici sul perché ciò potrebbe non essere un modo preciso per dirlo - invece di immergerti direttamente nei dettagli . Il tuo post ha bisogno di un riepilogo esecutivo, in sostanza, e di un'introduzione, prima di iniziare a esaminare le cose in profondità.
doppelgreener,

-11

Per dirla brevemente, direi che non tutti i fotogrammi sono disegnati ma solo quelli necessari per presentare la tua storia o il tema del gioco o del gioco. Inoltre, la tempistica delle cose che vorresti accadere in determinati casi sarebbe importante.


9
Questo non ha nemmeno senso contro la domanda posta ... Penso che tu abbia confuso "frame" per qualcos'altro ... ti stai forse confondendo con elementi di una trama? OP sta specificamente parlando di frame nel contesto del rendering
Trotski94
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.