Bildschirmübergänge in Legend of Zelda verwenden die undokumentierten Funktionen von NES

Für den Effekt des vertikalen Bildlaufs im ersten Teil von „The Legend of Zelda“ werden NES-Grafik- „Hardware“ -Manipulationen verwendet, die von den Konsolenentwicklern höchstwahrscheinlich nicht bereitgestellt werden.


Ich habe keinen Zugriff auf die offizielle Dokumentation der Picture Processing Unit (PPU - Grafikchip) der NES-Konsole, daher sind meine Aussagen zu "undefiniertem Verhalten" eher Vermutungen. Ich habe die Spezifikation der Grafikhardware aus dem NesDev-Wiki übernommen . Die PPU wird durch Schreiben in Register mit Speicherzuordnung gesteuert. Wenn Sie diese Register so verwenden, wie es (wie es scheint) von den Designern konzipiert wurde, ist es unmöglich, diesen Effekt zu erzielen:


Wenn Sie den Bildschirm vertikal scrollen, sollte der gesamte Bildschirm auf einmal scrollen. Das vorherige GIF zeigt ein Beispiel für teilweises vertikales Scrollen. Ein Teil des Bildschirms bleibt stationär (Schnittstellenelemente) und der andere Teil (Spielbereich) rollt vertikal. Ein teilweises vertikales Scrollen ist mit der "Standard" -Arbeit mit PPU nicht möglich.

Im Gegensatz dazu ist ein teilweises horizontales Scrollen vollständig definiert und möglich.


Das Schreiben in ein separates PPU-Register zum Zeitpunkt des Zeichnens des Frames kann zu grafischen Artefakten führen. Die Legende von Zelda verursacht absichtlich ein Artefakt, das sich als partielles vertikales Scrollen manifestiert. In diesem Beitrag werde ich ein wenig über NES-Grafikhardware sprechen und erklären, wie der Trick des vertikalen Bildlaufs funktioniert.

Arten von Grafiken


Die NES-Konsole verfügt über zwei Arten von Grafiken:

  • Sprites sind Kacheln, die an beliebigen Stellen auf dem Bildschirm platziert und unabhängig voneinander verschoben werden können.
  • Hintergrund - Ein Kachelraster, das problemlos als einzelnes Bild gescrollt werden kann.

Um den Unterschied zwischen den beiden zu demonstrieren, werde ich eine Szene zeigen, die aus Sprites und Hintergrund besteht:


Und hier ist dieselbe Szene, in der nur Sprites sichtbar sind:


Und hier ist eine Szene, in der nur der Hintergrund sichtbar ist:


Scrollen


Der Bildprozessor (NES Picture Processor) unterstützt das Scrollen von Hintergrundbildern. Im Grafikspeicher wird das Hintergrunddiagramm als zweidimensionales Kachelraster gespeichert, das einen Bereich abdeckt, der doppelt so breit und hoch wie der Bildschirm ist.

In diesem Raster wird auf dem Bildschirm ein „Fenster“ in der Größe eines Bildschirms angezeigt, und die Position dieses Fensters kann präzise gesteuert werden. Durch schrittweises Verschieben des sichtbaren Fensters entlang des Rasters wird ein sanfter Bildlaufeffekt erzeugt.

Das ausgegebene NES-Videosignal hat eine Größe von 256 x 240 Pixel. Das Kachelraster im Speicher wird als 512 x 480 Pixel große Fläche dargestellt und in vier bildschirmgroße Rechtecke unterteilt, die als "Namenstabellen" bezeichnet werden. Spiele können die Picture Processing Unit (PPU) konfigurieren, indem sie die Position des sichtbaren Fensters durch Auswahl der Pixelkoordinate im Raster der Namenstabellen angeben.

Wenn Sie die Koordinate (0, 0) auswählen, wird die gesamte obere linke Namenstabelle auf dem Bildschirm angezeigt:


Wenn wir zu (125, 181) übergehen, sehen wir aus jeder Namenstabelle ein wenig:


Das sichtbare Fenster wird auf die Rückseite des Kachelrasters im Speicher minimiert. Wenn wir zu (342, 290) übergehen, platzieren wir die obere linke Ecke des sichtbaren Bildschirms in der unteren rechten Namenstabelle. Dank der Faltung sind Teile jeder Namenstabelle sichtbar:


Nicht genug Speicher!


Jede Namenstabelle hat eine Größe von 1 KB, aber NES weist diesen Tabellen nur 2 KB seines Videospeichers zu, sodass jeweils nur zwei Namenstabellen in den Speicher passen.

Wie kann es vier Namenstabellen haben?

Spiegeln von Namenstabellen


Der Videospeicher ist so mit der PPU verbunden, dass, wenn die PPU eine Kachel einer der vier scheinbaren Namenstabellen rendert, tatsächlich eine der beiden realen Tabellen ausgewählt wird und das Lesen von dort kommt. Im Wesentlichen bedeutet dies, dass die vier sichtbaren Namenstabellen tatsächlich aus zwei identischen Tabellenpaaren bestehen.

Dieses Bild zeigt eine Momentaufnahme des Inhalts aller vier Tabellen. Oben links und oben rechts sind die gleichen wie in den beiden unteren.


Warum dann nicht einfach zwei Namenstabellen führen?

Glücklicherweise kann die genaue Bindung zwischen der scheinbaren und der realen Tabelle zur Laufzeit konfiguriert werden. Wenn das Spiel horizontales Scrollen ausführen möchte, wird die Grafikausrüstung so angepasst, dass die Tabellen oben links und oben rechts unterschiedlich sind und ohne merkliche Duplizierung gescrollt werden können. In dieser Konfiguration beziehen sich die Tabellen oben links und unten links auf dieselbe Tabelle mit echten Namen. ähnlich für die beiden rechten Tabellen. Diese Konfiguration wird als vertikale Spiegelung bezeichnet.


Es gibt auch eine andere mögliche Konfiguration - "Horizontale Spiegelung", die Spiele für vertikales Scrollen verwenden.


In der Regel scrollen Spiele nicht diagonal, da durch die Spiegelung der Namenstabellen Artefakte an den Bildschirmrändern entstehen.

Patronen


Die Kassette jedes Spiels verfügt über Hardware, mit der Sie die Tabellenspiegelung konfigurieren können.


Einige Spiele müssen die Spiegelung überhaupt nicht wechseln, daher ist die horizontale oder vertikale Spiegelung in ihren Kassetten fest codiert. Andere Spiele wechseln dynamisch zwischen diesen beiden Modi, sodass die Spiegelung in ihren Kassetten programmgesteuert konfiguriert wird. Die Legende von Zelda gehört zur zweiten Kategorie. Schließlich verfügen die Kassetten einiger wirklich komplexer Spiele über zusätzlichen Videospeicher, dh sie müssen überhaupt nicht gespiegelt werden: Sie können gleichzeitig vertikal und horizontal ohne sichtbare Duplizierungsartefakte scrollen.

Echtes Beispiel



Ein Beispiel für vertikales Scrollen, das auf dem Bildschirm angezeigt wird.


Dies zeigt eine Aufzeichnung von Namenstabellen mit horizontaler Spiegelung. Das aktuell sichtbare Fenster wird hervorgehoben.

Denken Sie daran, dass das vertikalste Scrollen nicht ungewöhnlich ist - das ungewöhnliche ist das vertikale Scrollen mit geteiltem Bildschirm .

Geteilter Bildschirm


Jeder Frame des von NES erzeugten Videosignals wird von oben nach unten gerendert, jeweils eine Pixelreihe. In jeder Zeile werden die Pixel einzeln von links nach rechts gezeichnet. Auf halbem Weg beim Rendern des Frames kann das Spiel die PPU neu konfigurieren, was sich auf die Anzeige von Pixeln auswirkt, die noch nicht gerendert wurden. Eine der häufigsten Änderungen in der Mitte des Rahmens ist das Aktualisieren der horizontalen Bildlaufposition.



Wenn Sie horizontal zwischen Räumen scrollen, beginnt The Legend of Zelda immer an der Bildlaufposition (0, 0) und rendert die Oberflächenelemente am oberen Bildschirmrand. Nach dem Zeichnen der letzten Zeile der Schnittstellenpixel auf dem Bildschirm ändert sich das horizontale Scrollen um einen Wert, der mit jedem Bild zunimmt, sodass sich die Kamera reibungslos bewegt.

Die Animation der Anzeige der Namenstabellen zeigt, wie das Spiel vor dem Scrollen von der horizontalen zur vertikalen Spiegelung und nach Abschluss des Übergangs wieder zur horizontalen Spiegelung wechselt. Während das Scrollen fortgesetzt wird, werden außerdem die Namenstabellen oben links (und unten links) aktualisiert und eine Kopie des Raums, den der Spieler betritt, wird darin aufgezeichnet. Nachdem der Bildlauf abgeschlossen ist, teilt das Spiel den Bildschirm nicht mehr und wird wieder vollständig aus der oberen linken Tabelle gerendert.

Rendering-Messung


Um den Bildschirm in die gewünschte Position zu teilen, muss das Spiel irgendwie herausfinden, welcher Teil des aktuellen Rahmens gezeichnet wurde. Pixelstrings werden mit einer bekannten Frequenz gerendert, sodass die Anzahl der gerenderten Pixelstrings durch Zählen der Anzahl der Prozessorzyklen bestimmt werden kann, die seit Beginn des Frames vergangen sind.

Es gibt eine andere, genauere Technik namens Sprite Zero Hit.

NES kann bis zu 64 Sprites gleichzeitig rendern. Das erste Sprite im Videospeicher heißt Sprite Zero (Zero Sprite). In jedem Frame tritt das Sprite Zero Hit-Ereignis auf, sobald ein undurchsichtiges Pixel eines Null-Sprites einem undurchsichtigen Hintergrundpixel überlagert wird. Es setzt ein Bit in eines der PPU-Register mit Speicherzuordnung, das vom Prozessor überprüft werden kann.

Um Sprite Zero Hit zum Teilen des Bildschirms zu verwenden, platzieren Spiele das Zero Sprite an einer vertikalen Position nahe dem geteilten Rand und überprüfen während des Renderns ständig, ob das Sprite Zero Hit-Ereignis aufgetreten ist. In diesem Fall wechselt das Spiel vom horizontalen Scrollen, um die Trennung zu implementieren.

Der horizontale Übergang zwischen Räumen mit und ohne Hintergrund ist unten dargestellt.




Der braune Kreis, der am Anfang des Übergangs erscheint und am Ende verschwindet, ist ein Null-Sprite. Wir werden uns die Benutzeroberfläche mit und ohne Hintergrund genauer ansehen:



Ein Zero-Sprite ist ein gebleichtes Bomben-Sprite, das perfekt zum regulären Bomben-Sprite über die Spieloberfläche passt. Das Null-Sprite ist so konfiguriert, dass es unter dem Hintergrund angezeigt wird. Da jedoch die schwarzen Pixel der Schnittstelle als transparent betrachtet werden, wäre die Null-Sprite-Bombe sichtbar, wenn sie nicht strategisch hinter der Bombe vor der Schnittstelle verborgen worden wäre.

Beachten Sie, dass Sprite Zero Hit einige Pixelzeilen vor der unteren Zeile der Benutzeroberfläche auftritt. Es tritt am oberen Pixel der Bombensicherung auf, die 16 Pixel vom unteren Rand der Schnittstelle entfernt ist. Wenn Sprite Zero Hit auftritt, beginnt das Spiel mit dem Zählen der Prozessorzyklen und nach Abschluss der erforderlichen Anzahl von Zyklen wird das horizontale Scrollen eingestellt.

Strahlausblendung


Meistens zeichnet die Konsolen-PPU Pixel auf den Bildschirm. Es gibt eine kurze Ausfallzeit zwischen Frames, während der das Rendern nicht durchgeführt wird. Dieses Phänomen wird als Austastung (Vertical Blank oder vblank) bezeichnet. Einige Arten von Änderungen an der PPU-Konfiguration können nur während vblank vorgenommen werden.

Bildlaufregister


Spiele ändern die PPUSCROLL , indem sie in das PPU-Register PPUSCROLL , das der Speicheradresse 0x2005 . Die erste Schreiboperation in PPUSCROLL definiert die X-Komponente der PPUSCROLL , und die zweite Operation setzt die Y-Komponente. In ähnlicher Weise wird eine alternative Aufzeichnung weiter durchgeführt.

Das Folgende zeigt alle Nicht-Null-Schreibvorgänge in PPUSCROLL während dieser Wiedergabe (in Zeitlupe) 16 Bilder des Bildschirms mit der Handlung des Spiels. Die Bildlaufpositionskomponente Y wird alle zwei Frames erhöht. Alle Schreibvorgänge in PPUSCROLL in diesem Beispiel werden während vblank ausgeführt, wodurch der gesamte Hintergrund mitgescrollt wird.




Scrolling Screen Split


Schreibvorgänge in PPUSCROLL während vblank werden am Anfang des unmittelbar nach vblank gezeichneten Frames wirksam. Wenn sich die Bildlaufposition während des Renderns des Rahmens ändert (d. H. Nicht während vblank), wird diese Änderung wirksam, wenn die Zeichnung die nächste Pixelreihe erreicht. Teilweises horizontales Scrollen wird durch Schreiben in PPUSCROLL implementiert, während das PPU-Gerät vor dem Scrollen die letzte PPUSCROLL zeichnet.




Beim Aktualisieren der Bildlaufposition in der Bildmitte wird nur die X-Position der Bildlaufposition angewendet. Das heißt, die Bildlaufpositionskomponente Y wird verworfen. Wenn das Spiel den Bildschirm teilen und die Position des Bildlaufteils des Rahmens ändern möchte, kann es nur horizontal scrollen.

Und trotzdem:



PPUSCROLL Sie es glauben oder nicht, der Wert des PPUSCROLL Registers PPUSCROLL sich während dieses Übergangs nicht geändert.

Sie können ein ein Pixel hohes grafisches Artefakt unter der Benutzeroberfläche sehen. Dies ist ein Fehler meines Emulators, der durch die fehlende Synchronisation der Prozessortaktzyklen mit der pixelweisen Wiedergabe verursacht wird.

Eingriffe in andere Register


Das zweite Register mit der Bezeichnung PPUADDR , das der Speicheradresse 0x2006 ist, wird zum Einstellen der aktuellen Videospeicheradresse verwendet. Wenn ein Spiel beispielsweise eine der Kacheln in der Namenstabelle ändern möchte, schreibt es zuerst die Videospeicheradresse der PPUADDR in PPUADDR und dann den neuen Wert der PPUDATA in PPUDATA - dies ist das dritte Register, das der Adresse 0x2007 .

Das Schreiben in PPUADDR nicht während vblank (d. H. Beim Rendern eines Frames) kann grafische Artefakte verursachen. Dies liegt daran, dass die PPU-Kette, die vom Schreiben in PPUADDR betroffen ist, auch direkt vom PPU-Gerät gesteuert wird, PPUADDR Kacheln aus dem Videospeicher zum Zeichnen PPUADDR . Da das Rendern auf dem Bildschirm von oben nach unten und von links nach rechts innerhalb der Linie ausgeführt wird, weist die PPU PPUADDR Wesentlichen PPUADDR Wert der Adresse der aktuell gezeichneten PPUADDR . Wenn das Rendern von einer Kachel zur nächsten PPUADDR wird, wird PPUADDR um den aktuellen Wert erhöht.

Somit kann das Schreiben in PPUADDR in der Mitte des Rahmens die von der PPU aus dem Speicher empfangenen Kacheln für die Dauer des aktuellen Rahmens ändern.

Lassen Sie PPUADDR Schreiboperationen während des vertikalen Sprungs zu PPUADDR . Da die Namenstabelle auch während des Übergangs aktualisiert wird, ist die Ausgabe aller Schreibvorgänge in PPUADDR zu umfangreich. Bei einem horizontalen Übergang wird das Scrollen während des Renderns einer PPUADDR 63 eingestellt. Daher werden Schreibvorgänge in PPUADDR nur während dieser Zeile in PPUADDR .




Das Muster ist deutlich sichtbar. Alle zwei Frames wird die in der Pixelzeile 63 aufgezeichnete Adresse um 32 (0x20) reduziert. Aber wie führt dies zu einer Aktualisierung der tatsächlichen Bildlaufposition?

Echtes Bildlaufregister


Innerhalb der PPU befindet sich ein 15-Bit-Register, das nicht der CPU zugeordnet ist. Es wird sowohl als aktuelle Adresse für den Zugriff auf den Videospeicher als auch als Hintergrund-Scrolling-Konfiguration verwendet.

Wenn Sie mit diesem Wert als Adresse arbeiten, wird Bit 14 ignoriert und die Bits 0-13 werden als Adresse im Videospeicher behandelt.

Wenn Sie mit diesem Wert als Bildlaufkonfiguration arbeiten, haben die verschiedenen Teile unterschiedliche Bedeutungen:


Die Auswahl einer Namenstabelle ist ein Wert zwischen 0 und 3, der die aktuelle Namenstabelle bestimmt, aus der die Zeichnung erstellt wird.

Grobes Scrollen in X und Grobes Scrollen in Y bestimmen die Koordinate der Kachel in der ausgewählten Namenstabelle. Dies ist die aktuell zu zeichnende Kachel.

Das genaue Scrollen entlang Y enthält einen Wert von 0 bis 7, der den aktuellen vertikalen Versatz der Pixelzeile innerhalb der aktuellen Kachel bestimmt. Kacheln sind Quadrate mit einer Seite von 8 Pixeln.

In diesem Register fehlt ein genaues Scrollen auf X. Es gibt ein separates Register, das nur den horizontalen Versatz des aktuellen Pixels enthält. Es ist jedoch nicht wichtig zu erklären, wie das vertikale Scrollen in The Legend of Zelda ausgeführt wird.

Was passiert mit diesem Register, wenn ein Spiel in PPUADDR schreibt? Hier sind die ersten drei Schreibvorgänge aus der oben gezeigten Demo.


Indem Sie die Einträge an der Adresse in Bildlaufkomponenten aufteilen, können Sie klar verstehen, was hier passiert. Alle zwei Frames nimmt der Wert des groben Bildlaufs in Y ab, was zu einem vertikalen Bildlauf um eine Kachel oder 8 Pixel führt.

Während jedes Rahmens beträgt der anfängliche Bildlaufversatz 0,0, wonach die Aufzeichnung auf der Pixelzeile 63 an der Adresse durchgeführt wird. Dies bedeutet, dass die ersten 63 Pixelzeilen vom oberen Rand der ausgewählten Namenstabelle mit dem Hintergrund der Benutzeroberfläche gezeichnet werden. Die 64. Pixelreihe wird jedoch weiter gerendert, wobei von dieser Adresse aus vertikales Scrollen angewendet wird. Da das vertikale Scrollen alle zwei Frames abnimmt, entsteht das Gefühl des vertikalen Scrollens eines Teils des Bildschirms.

Scrollen Sie nach unten, um nach oben zu scrollen


Die Legende von Zelda kann diesen Trick nicht vollständig vor den Spielern verbergen. Auf den vertikalen Übergängen des Bildschirms entsteht ein sichtbares Artefakt, das sich bei genauem Hinsehen bemerkbar macht. Wenn Sie sich zwischen Räumen bewegen, wird der erste Frame der Bildlaufanimation nach unten gescrollt. Hier ist die Animation in sehr Zeitlupe.



In der Namenstabelle können Sie sehen, was wirklich passiert. Obwohl es den Spielern so erscheint, als würde der sichtbare Bereich reibungslos nach oben scrollen, beginnt der Bildlaufübergang damit, dass der sichtbare Bereich von der oberen linken Namenstabelle zur unteren linken Tabelle verschoben wird, die eine Kopie des Hintergrunds des Raums enthält. Dies ist erforderlich, da die Benutzeroberfläche am oberen Bildschirmrand ebenfalls Teil der Namenstabelle ist. Wenn der sichtbare Bereich von seiner ursprünglichen Position nach oben gescrollt wird, wird die Benutzeroberfläche durchlaufen.

Das vertikale Scrollen wird implementiert, indem in das PPUADDR Register in der Mitte des Rahmens geschrieben wird. Der allererste zu schreibende Wert ist 0x2800 . Zwei Bilder später wird 0x23A0 aufgezeichnet, und dann beginnt der Wert mit jedem zweiten Bild um 32 abzunehmen.


Durch Schreiben des Werts 0x2800 in das 0x2800 Register wird PPUADDR auf 2 gesetzt, was zum Rendern der unteren linken Namenstabelle führt. Da beide Bildlaufwerte 0 sind, beginnt sie in der oberen linken Kachel dieser Namenstabelle. Das genaue Scrollen in Y ist jedoch 2, sodass ein vertikaler Versatz von zwei Pixeln vom oberen Rand der unteren linken Namenstabelle vorhanden ist. Aus diesem Grund sehen wir im ersten Frame des Übergangs einen 2 Balken hohen schwarzen Balken am unteren Bildschirmrand. Der anfängliche Bildlaufwert für die Übergangsanimation wird um 2 Pixel nach unten verschoben, um den Übergang nahtlos zu gestalten.

Zwei Frames später wird der PPUADDR in 0x23A0 . Dies bringt uns zurück zur oberen linken Namenstabelle und wir rendern aus der 29. Kachelreihe, dh der unteren. Das genaue Scrollen in Y enthält noch 2.

Warum muss Exact Scrolling in Y auf 2 gesetzt werden? Warum schreibt das Spiel nicht einfach 0x0800 und 0x03A0 , um nicht unter einem Zwei-Pixel-Offset zu leiden?

Vier Namenstabellen belegen den 4-KB-Bereich im PPU-Adressraum von 0x2000 bis 0x2FFF . Jede Kachel in der Tabelle belegt ein Byte Videospeicher (tatsächlich sind sie nur Indizes in einer anderen Tabelle), und die Reihenfolge der Kacheln und Namenstabellen im Videospeicher ist so, dass die Auswahl einer Tabelle mit Namen , das grobe Scrollen nach Y und das grobe Scrollen nach X den Versatz der Kachel im Inneren ausmachen Speicherbereiche mit Namenstabellen. 0x2000 Sie also die unteren 12 Bits des internen PPU-Registers nehmen und zu 0x2000 , finden Sie die 0x2000 im Videospeicher. Und das ist kein Zufall! Genau so sollte das Register behandelt werden: sowohl als Adressregister als auch als Bildlaufregister.

Aber es gibt einen Fehler.

Bei der Verarbeitung als Adressregister werden die Bits 12 und 13 als Teil der Adresse betrachtet. Während des Renderns überschreibt die PPU das Register ständig mit der Adresse der aktuell gerenderten Kachel. Da sich die Kacheln in den Namenstabellen und die Tabellen im Speicherbereich von 0x2000 bis 0x2FFF , weist die PPU dem Register Werte aus diesem Intervall zu.

Wenn das Spiel in der Mitte des Frames in PPUADDR schreibt und die PPUADDR in der PPUADDR notiert, PPUADDR die PPU, von einer anderen Stelle im Videospeicher zu lesen. Alle Bytes, die er zufällig zählt, werden als Kacheln wahrgenommen, was wahrscheinlich zu unerwünschten Ergebnissen führt. Daher müssen alle in der Mitte des Frames in PPUADDR aufgezeichneten Werte im Bereich von 0x2000 bis 0x2FFF . Unter Berücksichtigung jeder Zahl in diesem Intervall und unter Berücksichtigung ihrer Bildlaufkomponenten sollte der exakte Bildlaufwert in Y immer gleich 2 sein.

Diese Einschränkung bedeutet, dass wir das exakte Scrollen in Y- Richtung in der Mitte des Rahmens nicht ändern können. Wenn Sie also diesen Trick verwenden, um das vertikale Scrollen der Bildschirmtrennung zu implementieren, können Sie nur 8 Pixel gleichzeitig scrollen und haben immer einen vertikalen Versatz von zwei Pixeln vom Kachelrand. Die Legende von Zelda verschiebt beim horizontalen Scrollen 4 Pixel pro Frame, beim vertikalen Scrollen jedoch 8 Pixel pro Frame, und jetzt wissen wir warum.

Das Artefakt macht sich auch beim Scrollen zwischen den Räumen bemerkbar. In diesem Fall tritt es jedoch am Ende der Animation auf.



Zusätzliche Lektüre


  • Das NesDev-Wiki ist eine unschätzbare Ressource, um mehr über die NES-Hardware zu erfahren. Das Thema dieses Beitrags sind insbesondere Seiten zum Scrollen der PPU
    und PPU-Register .
  • Mein noch sehr unfertiger NES-Emulator ist hier verfügbar.

Anmerkungen


Bis ich etwas über das interne Register der PPU erfuhr, zeigte mein Emulator den Effekt des Löschens während vertikaler Übergänge des Bildschirms The Legend of Zelda.



Das Sprite von Link bewegte sich wie gewünscht über den Bildschirm, aber der Hintergrund rollte nicht. Die Löschung wurde durch die Tatsache verursacht, dass das Spiel die Namenstabelle schrittweise aktualisierte, sodass sie die Grafiken des neuen Raums enthielt, das Scrollen jedoch nicht aktualisierte, um die Aktualisierungen außerhalb des Bildschirms zu halten.

Source: https://habr.com/ru/post/de460383/


All Articles