Polygone eine andere Welt: Amiga 500

Dieser Artikel ist Teil einer Serie über die Häfen des Spiels Another World. Es geht um Tricks beim Arbeiten mit dem Amiga 500 . Es wird empfohlen, zuerst den vorherigen Artikel zu lesen.


Die Amiga-Geschichte beginnt Mitte 1982 mit einem Anruf von Larry Kaplan an Jay Miner. Beide arbeiteten dann in den 70er Jahren bei Atari. Beide beschlossen, die Firma zu verlassen. Kaplan aufgrund mangelnder Anerkennung und Miner aufgrund eines Führungsverbots für den Einsatz des coolen, aber teuren Motorola 68000-Prozessors.


Kaplan verließ Atari und gründete Activision. Nachdem ihn Investoren gebeten hatten, eine neue Gaming-Plattform zu entwickeln, kontaktierte er die brillantesten Leute, die er kannte. Miner übernahm die Hardware des Problems bei der neu gegründeten Firma Hi-Toro. Das System erhielt den Codenamen "Lorraine".


Ende 1983 wurde ein Prototyp zusammengebaut. Das Gerät beeindruckte die Besucher der Consumer Electronics Show (CES) im Januar 1984 dank der Boing Ball-Demo, bei der sich riesige Sprites mit einer Bildrate von 60 Bildern pro Sekunde bewegten. Das Gerät wurde 1985 unter dem Namen "Amiga from Commodore" angekündigt, später in Amiga 1000 umbenannt.




Hinweis: Der Amiga 1000 konnte nicht von alleine booten, das Gerät hatte kein ROM. Der Bootloader befand sich auf einer Diskette, und es wäre besser, wenn Sie ihn als den Apfel Ihres Auges speichern würden!


Artikelserie


  1. Polygone eine andere Welt .
  2. Polygone eine andere Welt: Amiga 500.
  3. Polygone Eine andere Welt: Atari ST .

A500


Nach einer Reihe von Fehlern befand sich Commodore 1985 in einer alarmierenden Situation am Rande des Bankrotts. Thomas Rattigan, dann COO, nahm eine radikale Veränderung vor. Neben einem ehrgeizigen Plan, der fast alle Unternehmensbereiche abdeckt, hat er den Amiga 1000 in zwei Produkte unterteilt: eine neue High-End-Version für den Kreativmarkt mit dem Namen Amiga 2000 und eine kostengünstige Version für den Commodore 64 mit dem Namen Amiga 500.


Der Amiga 500, auch als A500 bekannt, wurde 1987 auf den Markt gebracht. Unter der Haube des Motorola 68000 arbeitete das Gerät mit 7,16 MHz und hatte 512 KB RAM. Das Gerät ist äußerst erfolgreich geworden, es hat Popularität unter Spielern, Programmierern, insbesondere Menschen aus der Demoszene gewonnen. Es war das meistverkaufte Produkt von Commodore (von 1987 bis 1991 wurden ungefähr 6 Millionen Einheiten verkauft [1] ).



Der A500 hatte ein ROM, aber es gab nur genügend Speicher für einen Bootloader namens Kickstart. Nach der Initialisierung des Geräts fordert Kickstart den Benutzer auf, eine Diskette einzulegen, die entweder ein Programm oder ein Workbench-Betriebssystem enthält. Die Diskette sollte im Laufwerk bleiben, solange das Gerät eingeschaltet ist. Spätere Modelle wie der A1200 (auch bekannt als die größte jemals hergestellte Maschine) hatten Platz für eine 2,5-Zoll-Festplatte und wurden von der Verwendung von Disketten befreit.


Architektur


Da die Technologie ursprünglich im Hinblick auf Spiele entwickelt wurde [2] [3] , wurde Amiga nicht wie die meisten damaligen Computer auf einen "eisernen" Prozessor mit der Fähigkeit zu Audio und Video aufgebaut. Der 32/16-Bit-68000 arbeitet mit dem Chipsatz zusammen, der drei leistungsstarke Chips enthält: Paula (Audio), Denise (Video) und Agnus (Datenmanipulation und -synchronisation).



Ein ähnliches Design mit einem Speichersystem, das nicht nur eine flache Adressierung bietet, sondern auch den gemeinsamen RAM, der sowohl für den Prozessor als auch für den Chipsatz verfügbar ist, trug wesentlich zur Popularität von Amiga bei den Entwicklern bei. Zum Vergleich: Weder Sega Genesis noch Nintendo SNES, zwei leistungsstarke Systeme, die Jahre später (im Januar 1989 bzw. im November 1990) veröffentlicht wurden, hatten ein gemeinsames Gedächtnis.


Der Chipsatzbus hat ein komplexes Prioritätssystem, bei dem 68.000 in geraden Zyklen nicht aktiv sind. Der DMA-Chipsatz (Direct Memory Access) versucht, nur ungerade Zyklen zu verwenden, um den Buszugriff schrittweise zu multiplexen, ohne den Prozessor zu beeinträchtigen. Aber nicht immer lief alles glatt. Insbesondere Agnus kam gut zurecht, wo 68.000 verhungerten [4] .


Um dieses Problem zu lösen, konnten Kunden die Erweiterung „Fast RAM“ mit einem dedizierten „CPU-Bus“ für 68000 erwerben. Mit den dortigen Anweisungen für 68000 [5] hungerte die CPU nicht, als der DMA-Kanal des Blitters [15] aktiv war. Dies verdoppelte die Ausführungsgeschwindigkeit von 68.000.


Videosystem


Das Videosystem wird vollständig von Denise gesteuert und bietet insgesamt zwanzig Grafikmodi [6] . Die beliebteste Auflösung war 320x200 mit einem Seitenverhältnis von 1,6, was nicht den Monitoren der damaligen Zeit entsprach (4/3 = 1,3). Das Seitenverhältnis führt zu Verzerrungen, wenn der Bildspeicher an den CRT-Monitor übertragen wird.



Der Framebuffer wird nicht kontinuierlich gespeichert, sondern in separaten Speicherbereichen, die als Bitebenen bezeichnet werden. Es können bis zu fünf [7] Bitebenen mit einer Größe von 8 KB zugewiesen werden. Dies ergibt 5 Bit pro Pixel, sodass Sie 32 Farbindizes erhalten. Auf den ersten Blick ist dieser Ansatz recht umständlich (insbesondere für Entwickler mit PC-Erfahrung), aber Agnus und insbesondere das Blitter insgesamt sorgen für mehr Klarheit.


Die Palette basiert auf einem 4-Bit-RGB-Farbraum pro Kanal. Mit 12 Bit pro Farbe können Sie bis zu 4096 verschiedene Farben identifizieren, was auf Computern derselben Epoche weit mehr als üblich war.


Dank vieler Tricks konnten wir mehr Farben anzeigen. Wie bei Kupfer können Sie die Palette in HSYNC ändern.


Die folgenden zwei Bilder repräsentieren zwei gegenüberliegende Seiten des RGB-Farbraums. Mit Schwarz bei Koordinaten (0x0, 0x0, 0x0), Rot bei (0xF, 0x0, 0x0), Grün bei (0x0, 0xF, 0x0), Blau bei (0x0, 0x0, 0xF) und Weiß bei (0xF, 0xF) 0xF) . Diese farbenfrohen Bilder veranschaulichen die Gestaltungsfreiheit, die Grafikentwicklern eingeräumt wird.




Eine andere Welt am Amiga


Eine andere Welt am Amiga ist in der Tat kein Hafen. Da der A500 für die Entwicklung verwendet wurde, ist dies die Originalversion, die der 21-jährige Eric Shayy zwischen 1989 und 1991 erstellt hat und der alleine in seinem Schlafzimmer arbeitete.



Zwei Gründe haben Amiga zur idealen Entwicklungsmaschine gemacht. Erstens erlaubte GenLock das Rotoskopieren. Zweitens und vor allem hat Amiga Agnus das Rendern von Polygonen erheblich erleichtert.


Blitter


Die Idee, ein Spiel zu erstellen, das ausschließlich auf Polygonen basiert, entstand aufgrund der falschen Annahme, dass "Dragon's Lair, Escape from Singes Castle" auf Amiga sie verwendete [8] . Eric musste das irgendwie mit einer vernünftigen Framerate umsetzen. In diesem Stadium der Forschung und Entwicklung spielte der Amiga-Blitter eine Schlüsselrolle.


Polygon-Zeichnung


In der Blitter-Dokumentation wird eine Funktion namens "Area Fill Mode" erwähnt. Wir sprechen nicht von einer ausgefallenen dreidimensionalen Projektion oder Texturierung. Blitter arbeitet im Bildschirmbereich für Bit-Strings mit der Option, "die Lücke zu füllen". Die Arbeit basiert auf dem Scannen von links nach rechts. Solange der Blitter 0 sieht, passiert nichts. Sobald die erste 1 übergeben wird, füllt der Blitter die Zeile mit Einheiten zur nächsten 1. Die Abbildung aus der Dokumentation veranschaulicht die Arbeit gut. Beachten Sie, dass mit dieser Methode auch ein konkaves Polygon korrekt angezeigt werden kann.


      Bit-Array vor Bit-Array nach
   ______________________ ______________________
  |  |  |  |
  |  |  |  |
  |  |  |  |
  |  1 1 1 1 |  |  11111 11111 |
  |  1 1 1 1 |  |  1111 1111 |
  |  1 1 1 1 |  |  111 111 |
  |  11 11 |  |  11 11 |
  |  1 1 1 1 |  |  111 111 |
  |  1 1 1 1 |  |  1111 1111 |
  |  1 1 1 1 |  |  11111 11111 |
  |  |  |  |
  |  |  |  |
  | ______________________ |  | ______________________ |

    

Eine solche Lösung führt zum zweiten Problem - wie man die "Grenzen" des Polygons zeichnet. Wenn Sie sich die Abbildung oben genau ansehen, werden Sie feststellen, dass dies ein nicht standardmäßiger Bresenham-Algorithmus ist [9] , da horizontale Linien übersprungen werden sollten. Zum Glück stellte Designer Amigi dem Blitter den Strichzeichnungsmodus vor [10] .


Wir sind noch nicht fertig. Es gibt immer noch Probleme. Zuerst muss viermal (einmal für jede Bitebene) "Linien zeichnen und dann den Bereich ausfüllen" ausgeführt werden, was sehr teuer zu sein scheint. Zweitens muss die Engine Hunderte von Polygonen rendern. Blitter benötigt einen sauberen Puffer voller Nullen und guter Einheitengrenzen, um damit zu arbeiten. Nach mehreren Polygonen sieht der Bildpuffer wahrscheinlich wie eine Brühe aus. Schließlich gibt der Blitter nur 1-ts aus, aber wir müssen in einigen der vier Bitebenen 0 ausgeben können, um die richtige 4-Bit-Farbe zu erzeugen.


Die Lösung für diese Probleme besteht darin, die Eingänge des A-, B- und C-Blitters zu konfigurieren [11] . Dieser Vorgang wird von Blogger Scali in seinem Blog [12] besser erklärt.


... es gibt eine Lösung für dieses Problem, und es ist nicht einmal so schwierig. Blitter kann an einer beliebigen Stelle im Chipmem gerendert werden. Sie können also problemlos einen temporären Bereinigungspuffer ("Notizblock") festlegen und ein Polygon darin zeichnen. Dann kopieren Sie es mit etwas Licht auf der Maske [16] in den tatsächlichen Bereich des Bildschirms. Oft wird dieser Vorgang auch als Cookie-Cut bezeichnet. Dies ist im Wesentlichen dieselbe Operation, die Sie bei 2D-Bildern verwenden würden, wenn Sie Pixel nur dann aufnehmen, wenn sie im Originalbild festgelegt sind, und die Zielpixel ansonsten intakt lassen würden (logische ODER-Operation). Dadurch werden die Polygone auf dem Bildschirm korrekt kombiniert.


Vielleicht ist es jetzt an der Zeit, den Blitter genauer zu erklären. Blitter hat 3 Eingänge und 1 Ausgang. Alle von ihnen werden von DMA verarbeitet, so dass es nach der Optimierung völlig unabhängig von der CPU arbeiten kann. 3 Eingänge können mit logischen Verknüpfungen verknüpft werden. Das Ergebnis wird dann in den Ausgangskanal geschrieben. Im Falle eines Mask Blits führen Sie im Allgemeinen die folgende Operation aus:


= ( ) ( )


- Scalis OpenBlog



Basierend auf den Eingabedaten des Blitters haben wir nun ein vollständiges Bild davon, was zum Rendern jedes Polygons erforderlich ist.


  1. Wählen Sie einen Puffer aus.
  2. Null sauber mit einem Puderzucker.
  3. Zeichnen Sie die Polygonränder mit Einheiten im Zeichenlinienmodus.
  4. Füllen Sie den Pufferbereich mit Einheiten im Modus "Flächenfüllung".
  5. Viermal ein Stück Puffer schlagen (einmal für jede Bitebene).

Es hat nicht so viel Spaß gemacht, aber die Arbeit war erledigt. Der Aufwand hat sich gelohnt, da das Programm (je nach Größe) bis zu 50 Polygone mit einer Geschwindigkeit von 20 Bildern pro Sekunde verarbeiten kann. Das bringt uns zum zweiten Problem.


Framebuffer kopieren


Egal wie schnell der Blitter die Polygone zeichnen konnte, es war immer noch nicht schnell genug. Jeder Frame besteht aus Tausenden von Polygonen. Einige Polygone sind so klein (1x1, Pixigons genannt), dass sie den Overhead nicht rechtfertigen. Einer der ersten Hintergründe im Spiel (wenn Leicester das Wasser verlässt) besteht aus 981 Polygonen.



Die Lösung bestand darin, den Hintergrund durch einfaches Kopieren in einem speziellen BKGD-Puffer zwischenzuspeichern. Dies war eine besondere Aufgabe für Blitter.


Blitter ist einer von zwei Coprozessoren im Amiga. Als Teil des Agnus-Chips werden rechteckige Speicherblöcke kopiert und Linien gezeichnet. Beim Kopieren des Speichers ist er ungefähr doppelt so schnell wie 68000 und kann fast vier Megabyte pro Sekunde bewegen. Er kann Linien mit einer Geschwindigkeit von fast einer Million Pixel pro Sekunde zeichnen.


- Amiga Entwickler CD v2.1 (OS 3.5)



Bei einer Geschwindigkeit von 4000 Bytes in Millisekunden dauert das Löschen eines BKGD-Puffers am Anfang jedes neuen Frames "nur" 8 ms.


Hinweis: Trotz der Tatsache, dass Another World ein poliertes Spiel war, blieben einige Kanten "rau". Wenn ein Spieler während des Kopierschutz-Quiz [13] versucht, schlau zu sein, und "c" drückt, um den Code für den Spielvorgang einzugeben, wird der Bildschirm grün und der Amiga friert ein. Der einzige Ausweg ist, das Spiel neu zu starten.


Framebufferfüllung


Obwohl der 68000-Prozessor jeweils 16 Bit aufzeichnen kann, wurde der Framebuffer wahrscheinlich auch mit einem Blitter gereinigt. Die Amiga-Dokumentation enthält ein Beispiel für einen "Clearmem" -Code [14] , der Blitter zum Bereinigen von 128 KB RAM verwendet.


Referenzen


  1. Wikipedia: Amiga 500 .
  2. Commodore: Die Amiga-Jahre .
  3. Commodore: Die letzten Jahre .
  4. Amiga Chip RAM .
  5. Wikipedia: Amiga Hardware .
  6. Amiga-Bildschirmmodi .
  7. Amiga Echtzeit 3D Grafik .
  8. Classic Game Postmortem - Eine andere Welt .
  9. Bresenhams Algorithmus .
  10. 6 Blitter-Hardware / Flächenfüllmodus .
  11. 6 Blitter Hardware / DMA-Kanal .
  12. Ich halte es einfach real, Teil 3 .
  13. Coderad .
  14. Amiga-Dokumentation, 'Beispiel: Clearmem' .
  15. Blitter .
  16. Bit blit .

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


All Articles