Werden alle Spiele durch Ziehen eines Rahmens erstellt?

60

Ich bin Anfänger und lerne etwas über Computeranimation (für Spiele). Bisher ist die einzige Methode, auf die ich gestoßen bin, das Zeichnen jedes Frames, jedes Frame-Update. Zu Beginn eines jeden Frames wird der gesamte Frame gelöscht, und dann werden die für diesen Frame erforderlichen Elemente neu gezeichnet.

Meine Frage ist, ob diese Methode die einzige ist, die zum Erstellen von Animationen und Spielen verwendet wird. Es scheint ein bisschen ineffizient zu sein. Ich verstehe auch nicht ganz, wie diese Methode für 3D- Spiele funktionieren würde . Könnte jemand dies bitte näher erläutern?

eeze
quelle
Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Josh
John Carmack hat fast den Ansatz für das Scrollen auf dem PC erfunden, indem er nur die dünne vertikale Schicht des Bildschirms gezeichnet hat, die sich geändert hat. PCs waren ohne diese Technik einfach nicht in der Lage, die Vollbildanzeige schnell genug zu aktualisieren. Er verwendete dies in den frühen 90ern bei vielen 2D-Spielen wie Commander Keen. Lesen Sie "Masters of Doom" für weitere Informationen.
Asche

Antworten:

68

Sehr alte Spiele verwendeten eine Technik, bei der nur die Teile eines Frames neu gezeichnet werden, die sich auf diesem Frame geändert haben. Woran ich mich erinnern kann, das Spiel "Little Big Adventure" verwendet diese Technik (1994). Man sieht aber, dass das Spiel die meiste Zeit über eine statische Kamera verfügt. Nur wenn Sie den sichtbaren Bereich verlassen, wird die Szene neu gezeichnet. Wenn Sie das Spiel spielen, werden Sie auch eine kleine Verzögerung in diesem Bild bemerken. Auf modernen GPUs mit modernen Game-Engines haben sich die Dinge geändert. Auf jedem Frame wird alles neu gezeichnet. Abhängig von der Rendering-Technik können die Dinge sogar mehrmals gerendert werden. Die Rechenleistung einer GPU ist einfach unglaublich hoch, wenn Sie sie richtig einsetzen. Die Wiederverwendung findet jedoch statt. Beispielsweise könnte eine Engine beschließen, die Schattenkarte nur alle fünf Frames zu aktualisieren. Oder die Beleuchtung wird nicht aktualisiert, solange sich die Lichtquellen nicht ändern.

Arne
quelle
23
Es sind nicht nur alte Spiele. Bei EA wurde versucht, den Akkuverbrauch von Laptops für bestimmte "Gelegenheitsspiele" zu senken, und eine Technik bestand darin, nur Teile des Bildschirms neu zu zeichnen. In Die Sims 3 konnte man das manchmal sehen, wenn man die Kamera stehen ließ und eine Sim über den Bildschirm lief. Manchmal gab es einen Fehler, bei dem das Neuzeichnen nicht groß genug war und Pixel in einer Linie über dem Bildschirm zurückblieben Bildschirm. Sie mussten nur die Kamera leicht bewegen, um ein vollständiges Neuzeichnen zu erzwingen, und die Linie verschwand.
Kevin Fee
12
Sehr alt ... 1994 ... ich fühle mich jetzt alt ...
6.
4
@alseether alt in Bezug auf Spiele. Denken Sie daran, dass wir von 8-Bit-Pixel-Blobs zu Fotorealismus (in vorgerenderten Zwischensequenzen, wenn nicht Live-Action) in nur 20-30 Jahren übergegangen sind.
Jared Smith
16

Nein.

Zumindest, wenn Sie alte Spiele aus den 70er Jahren einbeziehen, die Vektoranzeigen verwendeten.

Zum Beispiel das weit verbreitete Spiel Asteroids, das ursprünglich für Vektoranzeigen entwickelt wurde, bei denen es sich um eine grundlegend andere Art der Darstellung von Grafiken auf einem Bildschirm handelt.

Vektormonitore wurden auch von einigen Arcade-Spielen der späten 1970er bis Mitte der 1980er Jahre wie Asteroids, Tempest und Star Wars verwendet. Atariused der Begriff Quadrascan, um die Technologie zu beschreiben, wenn sie in ihren Videospielarkaden verwendet wird.

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

Moderne Grafiken sind zu 100% für die Rasterung gedacht, bei der per Definition der Inhalt eines Grafikpuffers für jeden Frame in die Anzeige geschrieben wird.

Sandy Chapman
quelle
7
Vektoranzeigen haben nicht einmal offensichtlich einen "Rahmen".
Hobbs
2
@hobbs Correct, wodurch meine Antwort immer noch korrekt ist, seit die Antwort auf "Werden alle Spiele durch Ziehen jedes Frames erstellt?" ist "Nein, nicht einmal alle Spiele basieren auf Frames."
Sandy Chapman
1
In einem tieferen Sinne ging es jedoch um das wiederholte Zeichnen aller sichtbaren Elemente, nicht nur der Elemente, die sich bewegen, und für die meisten Vektoranzeigen lautet die Antwort immer noch "Ja" (Bildspeicherungsröhre wäre eine Ausnahme)
szulat
@szulat in gewisser Weise, aber um fair zu sein, es zieht immer noch nicht in die Lücken, in denen die Anzeige schwarz ist. Es werden nur die sichtbaren Elemente auf dem Bildschirm aktualisiert. Dh bei Asteroiden werden nur das Schiff und die verbleibenden Asteroiden auf dem Bildschirm neu gezeichnet.
Sandy Chapman
@ SandyChapman und auf einer anderen Ebene gibt es wirklich wenig Unterschied. Ein Spiel aktualisiert den Bildschirmspeicher oder Sprites, wenn sich etwas ändert. ansonsten bleibt der entsprechende Teil der Anzeige statisch. Dies gilt sowohl für Raster- als auch für Vektorsysteme. „Asteroids“ übernimmt die Bildschirmaktualisierung aus dem (Vektor!) - Bildschirmspeicher, ohne die CPU zu beeinträchtigen. Ebenso wie die zx spectrum-Hardware ihr Raster-Videosignal generiert. Ob der reale oder der imaginäre CRT-Strahl Polygone zeichnet oder den Bildschirm in einem festen Muster abtastet, ist zweitrangig.
Szulat
11

Auf der untersten Ebene berechnet der Grafikprozessor Ihres Computers tatsächlich jeden Frame von Grund auf und sendet ihn an Ihren Bildschirm. Sie sind dem jedoch nur ausgesetzt, wenn Sie diese einfachen Dinge selbst verwalten. [1] Jede Grafik- (und damit Spiel-) Engine erledigt diese Dinge für Sie, und Sie können die Szene frei ausdrücken In Bezug auf viele Entitäten, die Sie zwischen Frames ändern könnten, die aber dauerhaft sind.

... wie diese Methode für 3D-Spiele funktionieren würde ...

Die Elemente im 3D-Raum sind beständig. Die Grafik-Engine berechnet das Bild auf Ihrem Bildschirm erneut auf etwaige Änderungen (Kamerabewegung usw.).

[1] ... wenn Sie zum Beispiel Ihre eigene Engine [2] mit so etwas wie OpenGL schreiben. Selbst in diesem Fall würden Sie wahrscheinlich dauerhafte Dinge zwischen Frames speichern.

[2] Welches ist keine Option für Ihr aktuelles Fähigkeitsniveau.

TauCraft
quelle
Haben Sie Referenzen zur Unterstützung von "Der Grafikprozessor auf Ihrem Computer berechnet in der Tat jeden Frame von Grund auf neu"?
Kromster
@Kromster: Meistens geht es um Effizienz. Da für jeden Frame möglicherweise eine vollständige Berechnung erforderlich ist und nicht genau bekannt ist, welche Teile dies nicht tun, ist eine teure Berechnung erforderlich, um genau zu bestimmen, welche Bits gespeichert werden können. Selbst wenn es sich um eine Nettoleistungsverbesserung handeln würde, würde dies zu inkonsistenten Bildraten führen.
MSalters
@MSalters die Art, wie es formuliert ist, widerspricht vielen Punkten in vielen Antworten der Nachbarn.
Kromster
Ich würde sagen, die Aussage "der Grafikprozessor auf Ihrem Computer berechnet tatsächlich jeden Frame von Grund auf" ist technisch nicht wahr. Die GPU berechnet genau das, was Sie ihm sagen. Wenn Sie möchten, dass der vorherige Frame wiederverwendet wird, ist dies die Standardeinstellung. Viele moderne Spiele-Engines (und sogar Betriebssystem-GUIs) beginnen bei Null (wobei der vorherige Frame nur angezeigt wird, wenn der neue Frame nicht rechtzeitig gerendert wurde), müssen dies aber nicht.
Ove
Ich bin mir nicht einmal sicher, was eine Referenz für "der Bildschirm muss gelöscht werden" sein würde, aber ich habe eine Referenz dafür, wie ein Frame in Doom gerendert wird: adriancourreges.com/blog/2016/09/doom-2016- Grafik-Studie ; Vergessen Sie nicht, dass eine mäßig hochwertige Grafikkarte in der Lage sein sollte, eine Billion Berechnungen pro Sekunde, mehrere tausend pro Pixel, auszuführen.
pjc50
2

Kurze Antwort: Nein.

Lange Geschichte:

Als ich in der Schule etwas Spielprogrammierung gelernt habe, wurde uns Folgendes beigebracht:

Entscheide, welche fps-Rate wir im Spiel haben wollten (zum Beispiel 30).

Schreiben Sie einen Code, der für jedes Intervall 1 zu einem Zähler hinzufügt (33 ms für 30 fps). Dieser Code wird gleichzeitig mit der Spieleschleife ausgeführt.

Dann reduziert die Spielschleife, die die Berechnungen für das Spiel durchführt (Spielstatusaktualisierung), den gleichen Zähler für jedes Bild um 1. Die Grafikberechnungen und das Zeichnen auf dem Bildschirm werden jedoch nur ausgeführt, wenn der Zähler auf Null steht.

Das Ergebnis ist, dass sich die grafische Framerate in Abhängigkeit davon ändert, wie gut die CPU die Berechnungen im Spiel handhabt. Wenn im Spiel nicht zu viel passiert, sind die Berechnungen einfach und die Grafik-Framerate wird höher als das tatsächliche Spielstatus-Update (im Grunde wird Zyklen verschwendet, da wir denselben Spielstatus mehr als einmal auf dem Bildschirm zeichnen).

Aber dann passiert viel im Spiel, die CPU wird mehr zu tun haben und Spielstatusaktualisierungen werden gegenüber dem Zeichnen auf dem Bildschirm vorrangig behandelt.

Die meiste Zeit wird das Spiel mit der vorgesehenen Geschwindigkeit aktualisiert, erscheint jedoch "verzögert", da nicht jedes Update auf dem Bildschirm angezeigt wird. Dies ist möglicherweise vorzuziehen, wenn sich das Spiel insgesamt verlangsamt, da Sie erzwingen, dass jedes Update auf dem Bildschirm angezeigt wird.

Dies geschah alles mit C ++ und ohne Spiel-Engine oder Grafikkarte. Alles lief auf einer Single-Core-CPU. Wir haben einige Bibliotheken für 2D-Grafiken verwendet.

user985366
quelle
1
Ich erinnere mich an das Spiel "Golden Axe". Wenn auf 8086 gespielt, war das Gameplay langsamer und viel einfacher zu handhaben als auf 286, wo sich die Dinge zum Beispiel schneller bewegten. Nur zu deiner Information.
Akostadinov
0

Bevor man sagen kann, ob Videospiele die Anzeige in jedem Frame "zeichnen", muss zunächst definiert werden, was mit "zeichnen" gemeint ist. Es gibt sicherlich viele Videospiele, bei denen sicherlich nicht alle Bilder von Grund auf neu zusammengestellt werden. in der Tat, viele Spiele - Plattformen nie voll Bitmaps zusammenbauen überhaupt .

Es gibt einige Ansätze, mit denen Videospiele eine Anzeige generieren können. Bei einer sehr kleinen Zahl schaltet die CPU den Elektronenstrahl für jedes Pixel ein und aus oder setzt für Vektor-Scan-Spiele die XY-Koordinate für jeden zu zeichnenden Punkt. Die meisten Spiele, die dies tun, tun dies hauptsächlich, um zu demonstrieren, dass die CPU schnell genug ist. Üblicherweise haben Spiele Hardware, die ohne CPU-Beteiligung wiederholt Pixel- oder Vektormuster auf dem Display ausgibt. Dieses Muster kann erzeugt werden, indem Daten sequentiell aus einem Speicherbereich gelesen und jedes Bit oder jede Gruppe von Bits als eine Pixelfarbe interpretiert werden (dies wird als Bitmap-Anzeige bezeichnet). In einigen Fällen kann die Hardware ein Byte Speicher für jede 8x8, 16x16, oder einen anderen Größenbereich der Anzeige und verwenden Sie dann dieses Byte, um einen Speicherbereich auszuwählen, der für Pixeldaten gelesen werden soll (dies wird häufig als Zeichentabelle-Anzeige bezeichnet). Einige Hardwareplattformen können mehrere Bitmap-Anzeigen mit konfigurierbaren Positionen überlagern. Diese werden als Sprites bezeichnet.

Bei einigen Plattformen kann das Anzeigemuster nicht geändert werden, während es an den Bildschirm gesendet wird. Stattdessen müssen alle Aktualisierungen vorgenommen werden, nachdem der Balken ein Bild gezeichnet hat, bevor er das nächste gezeichnet hat. Auf solchen Plattformen muss alles, was auf einem Frame erscheinen soll, vor dem Start dieses Frames in die Display-Hardware geladen werden, und das Display kann nur ein Muster anzeigen, das auf einmal eingerichtet werden kann. Wenn die CPU nicht mehr läuft, während der Frame angezeigt wird, wird derselbe Frame auf unbestimmte Zeit angezeigt. Auf anderen Plattformen kann das Muster geändert oder neu konfiguriert werden, während es auf dem Bildschirm angezeigt wird. Dies ermöglicht es, einen Bildschirm darzustellen, der viel komplizierter ist, als die Videoschaltung selbst handhaben könnte.

Die meisten PC-Spiele verwenden Hardware, die zum Zeichnen eines einzelnen Bitmap-Bildschirms konfiguriert ist, und zeichnen dann auf diesen Bildschirm alles, was anders sein muss als das, was bereits vorhanden ist. Manchmal ist es einfacher, Dinge zu zeichnen, ohne zu berücksichtigen, ob dies in einem bestimmten Fall tatsächlich erforderlich ist, aber wenn der Code leicht erkennen kann, dass ein Teil des Bildschirms nicht geändert werden muss, kann die Leistung durch Überspringen dieses Teils verbessert werden. Heutige Plattformen sind oft schnell genug, um den gesamten Bildschirm im Verlauf eines Frames um ein Vielfaches zu zeichnen, was in der Vergangenheit jedoch nicht der Fall war. Der schnellstmögliche Code zum Schreiben aller Pixel auf dem hochauflösenden Bildschirm des Apple II-Computers benötigt beispielsweise mehr als zwei Frames und der schnellstmögliche Code zum Kopieren aller Pixel auf dem Apple II-Computer. s hochauflösender Bildschirm aus einem anderen Puffer würde das Doppelte dauern. Um eine gute Leistung zu erzielen, müssen Spiele nur Dinge aktualisieren, die sich tatsächlich geändert haben, und genau das haben gute Spiele im Allgemeinen getan.

Superkatze
quelle
1
Ich habe die Hälfte dieser Antwort erreicht und bin mir nicht sicher, wie die Frage tatsächlich beantwortet wird. In Ihrem ersten Absatz geht es um CPUs, XY-Koordinaten, Elektronenstrahlen, Speicherbytes und Sprites. Dabei geht es jedoch nicht sichtbar darum, jeden Frame zu zeichnen. Der zweite Absatz befasst sich ausführlich mit Anzeigemustern und verliert mich dann. Ich denke, Sie müssen das übernehmen, worum es dabei geht, den Bildschirm tatsächlich neu zu zeichnen, es in einer klaren Aussage nach oben zu setzen und dann alles, worüber Sie noch sprechen müssen, damit in Verbindung zu bringen, um zu erklären, was vor sich geht.
Doppelgreener
1
@doppelgreener: Der Begriff "Zeichnen" jedes Frames ist etwas vage. Etwas muss alles tun, um jeden Frame zu generieren, aber es gibt viele Möglichkeiten, die von der CPU und der Hardware unterschieden werden können. Einige Möglichkeiten erfordern, dass die CPU in jedem Frame involviert ist, selbst wenn Teile des Bildschirms zwischen einem Frame und dem nächsten gleich aussehen, während andere dies nicht tun. Während jedes LCD- oder CRT-Spiel letztendlich erfordert, dass bei jedem nicht leeren Frame etwas ausgegeben wird [Spiele, die E-Paper oder Flip-Dot-Displays verwenden, möglicherweise nicht], können die erforderlichen Aktionen als "Zeichnen" betrachtet werden oder auch nicht.
Supercat
Ich schlage vor, Sie beginnen mit der einfachen Sprache (ob wir ständig "einen Rahmen zeichnen") und arbeiten von dort aus zurück, um weitere technische Details zu erläutern, warum dies möglicherweise nicht die richtige Art ist, es auszudrücken - anstatt direkt in die Details einzutauchen . Ihr Posten benötigt im Grunde genommen eine Kurzzusammenfassung und eine Einführung, bevor Sie anfangen, die Dinge auf die Tiefe zu untersuchen, die Sie tun.
Doppelgreener
-11

Kurz gesagt, ich würde sagen, dass nicht alle Bilder gezeichnet sind, sondern nur diejenigen, die für die Darstellung Ihrer Geschichte oder Ihres Themas zum Spiel oder zum Spielen erforderlich sind. Außerdem spielt der Zeitpunkt der Dinge, die in bestimmten Fällen passieren sollen, eine Rolle.

Sakib Zang
quelle
9
Dies ergibt bei der gestellten Frage nicht einmal einen Sinn. Ich glaube, Sie haben "Rahmen" für etwas anderes verwechselt. Werden Sie möglicherweise mit Elementen eines Storyboards verwechselt? OP spricht speziell über Frames im Kontext des Renderns
Trotski94