Hallo Besucher, der Thread wurde 3,8k mal aufgerufen und enthält 18 Antworten

letzter Beitrag von Haubitze am

3D (Spiele-)Programmierung

  • Hallo Leute,


    ich habe nach fast 25 jähriger Abstinenz auch wieder den C64 entdeckt :)


    Irgendwie hätte ich auch mal Lust, programmiertechnisch mit dem C64 wieder was zu machen. Bin erfahren was C#, .NET usw. angeht, aber in Assembler bin ich nicht fit.


    Was in Richtung 3D zu machen, wäre cool, evtl. demo-mässig was in diese Richtung : http://www.c64-wiki.de/index.php/Project_Stealth_Fighter


    Ich vermute ja stark, dass dieses Spiel in Assembler und nicht in Basic implementiert worden ist.


    Hat einer von euch Erfahrung, wieviel Aufwand es ist, so was mit dem C64 zu realisieren? Mir fehlt da ein gesundes Bauchgefühl; ich vermute mal der Aufwand ist sehr gross; aber evtl. gibt es von der Community auch 'Libraries', Coding-Snippets?


    Danke mal.

  • Hallo,


    mal sehen, ob ich die Frage beantworten kann.


    > Ich vermute ja stark, dass dieses Spiel in Assembler und nicht in Basic implementiert worden ist.
    Korrekt. Ohne Assembler läuft nichts. Basic ist viel zu langsam, und auch in Assembler muß man erheblich tricksen (z. B. selbstmodifizierender Code, Multiplikationstabellen), um eine einigermaßen erträgliche Bildrate zu erhalten.
    > ich vermute mal der Aufwand ist sehr gross;
    Immens. Rechne mit einer Entwicklungszeit von mindestens einem Jahr.
    > gibt es von der Community auch 'Libraries', Coding-Snippets?
    Die gibt es; jedenfalls lagern auf meinem Rechner irgendwo alte Bibliotheken für die mathematischen Berechnungen oder die Graphik. Das wäre nicht das entscheidende Problem.
    Viel wichtiger sind die folgenden Fragen:
    a) Wie genau soll das 3d-Programm aussehen? Ist es "nur" eine Demo oder ein echtes Spiel/Simulation? Soll es eher ein Weltraumshooter sein mit gegnerischen Angreifern (z. B. Elite) oder ein Flugsimulator (stationäre Gebäude und Landschaftsberechnung)? Ist eine vollständige Bewegung im 3d-Raum nötig (winkelabhängig oder frei) oder nur in der Ebene (z. B. Stellar 7 oder Arctic Fox)? All das trägt entscheidend dazu bei, welche Algorithmen zur Verwendung kommen.
    b) Anhand der Beschreibung ("C#, .NET usw.") kann man nicht abschätzen, welche Erfahrung z. B. in der Graphikprogrammierung vorhanden ist. Folgende Begriffe z. B. sollten keine Fremdwörter sein: Rotationsmatrix, Normalenvektor, hidden-line-removal, Bresenham-Linienalgorithmus. Tip: Um ein Gefühl dafür zu kriegen, einmal mit C (ohne Objektorientierung) und SDL ein Programm schreiben, welches in einem Graphikpuffer per Hand (ohne irgendwelche Bibliotheksroutinen) eine Linie zeichnet oder ein Polygon füllt. (Der Puffer darf ruhig mit SDL auf die Graphikkarte geschaufelt werden.) Oder gleich in x86 mit Nasm schreiben. Das entspricht in etwa dem, was auf dem C64 verlangt würde, nur daß es dort noch schwieriger, weil umständlicher ist.
    Um ein Beispiel zu geben:
    Während man in C und selbst in x86 noch auf einigermaßen standardisierte Datentypen zurückgreifen kann (in der Regel 32 Bit-Integer), fängt das Problem beim C64 schon damit an, daß man sich ein eigenständiges Zahlenformat ausdenken muß. Beispiel: Elite benutzt für die Matrix eine Festkommadarstellung mit dem Wertebereich von 0 bis $6000, wobei $6000 = 1.0 ist. Andere Programme verwenden $4000 (ist einfacher) oder nur $40 (ist entsprechend ungenauer). Driller verwendet 16 Bit für die Objektkoordinaten, kann daher keine großen Landschaften erzeugen. Mercenary verwendet 24 Bit und kann damit eine ganze Stadt mitsamt Umland definieren. Elite verwendet 16 Bit für fremde Objekte und 24 Bit für Planet und Sonne...
    Daher zunächst folgender Rat: Sofern noch nicht gemacht, bitte neben Project Stealth Fighter folgende Programme ansehen: Stellar 7 (Bewegung in der Ebene, schnelle Berechnung durch Polarkoordinaten), Elite (Weltraumspiel mit relativem Koordinatensystem und hidden-line-removal), Space Rogue (Weltraumspiel mit Weltkoordinatensystem und gefüllten Polygonen), Mercenary (schnelle Berechnung von Landschaft und Objekten mit Liniengraphik) und Chuck Yeager (Flugsimulator mit gefüllten Polygonen). Diese Spiele stellen m. E. das Optimum dar, was man aus dem C64 3d-technisch herausholen kann. Jedoch verwenden alle verschiedene Algorithmen zur Berechnung. Von daher ist es zunächst einmal wichtig, genau zu wissen, was man will und ob einem dieses Ergebnis zufrieden stellen kann. Wenn man nach einem Jahr Programmierung schließlich bemerkt, daß einem eine Bildrate von nicht einmal 10 Bildern pro Sekunde nicht genügt, wäre es schlicht Zeitverschwendung.

  • Danke mal für deine ausführliche Antwort!


    Ja, sollte erst mal eine Demo sein...natürlich wäre es cool, so was wie Stealth Fighter oder F16 Combat Pilot hinzubekommen, aber das wäre wohl eher eine Lebensaufgabe :).
    Ich denke der Reiz mit 3D/C64 liegt darin, dass man wirklich die Basics lernt und man die 3D Artifake selber designen kann, da sie mehr oder weniger aus einfachen geometrischen Formen bestehen....


    Hab mir überlegt, ob vllt. der C128 eine bessere Alternative darstellt? Zumindest ist hier ja die CPU auf 2 MHZ getacktet , evtl. ist das bessere Basic auch von Vorteil ?....ich weiß noch nicht, ob es sinnvoll ein Hybrid-Ansatz zu fahren (Basic+Assembler).

  • Vektorgrafik auf dem C64 ist nun schon bald das schwierigste, das man überhaupt machen kann, da man schon am bzw. jenseits des Limits ist, was der Rechner überhaupt schaffen kann. Da muss man schon alle Tricks bzgl. Optimierung draufhaben.


    Mein Tipp wäre, das vielleicht mal als Fernziel auf dem Schirm zu behalten, aber erstmal mit was viiiiel einfacherem anzufangen. Der C64 bietet ja einiges an Harwareunterstützung durch den VIC (Softscrolling, Tiles, Sprites, ...). Damit kann man schon mal einiges machen, auch ohne die letzten Taktzyklen rauszuquetschen.


    Und wenn Du mal so weit eingestiegen bist, dass Du auch nur eine simple Grafikdemo hinkriegst, besteht eigentlich absolut kein Grund mehr, Basic zu verwenden.

  • > Ich denke der Reiz mit 3D/C64 liegt darin, dass man wirklich die Basics lernt und man
    > die 3D Artifake selber designen kann, da sie mehr oder weniger aus einfachen geometrischen Formen bestehen....
    Volle Zustimmung. Das ist auch der Grund, warum ich mich so lange mit 3d-Programmierung auf dem C64 beschäftigt habe. Graphikprogrammierung auf dem PC ist m. M. n. dagegen eher öde. Und Elite und Mercenary gehören auch heute noch zu den Spielen, die ich immer wieder gerne raushole, weil sie ein ganz eigenes Flair haben, das ich so noch bei keinem anderen gefunden habe.


    > Hab mir überlegt, ob vllt. der C128 eine bessere Alternative darstellt?
    > Zumindest ist hier ja die CPU auf 2 MHZ getacktet , evtl. ist das bessere Basic auch von Vorteil ?
    Leider nicht. Bei der 2 Mhz-Taktung funktioniert der Videochip VIC nicht mehr, der aber für die Graphikdarstellung gebraucht wird. Der neue Videochip im C128 für die 80-Zeichendarstellung ist für die 3d-Darstellung nicht geeignet. Man kann allerdings beim C128 im C64-Modus die 2 Mhz-Taktung mittels Rasterinterrupt partiell einschalten, wenn sich der Rasterstrahl des VIC außerhalb des darzustellenden Bereichs befindet, um so ein bißchen mehr Leistung herauszukitzeln.
    Das Basic des C128 ist nicht von Vorteil. Es verfügt zwar über allgemein gehaltene Graphikbefehle, ist aus dem Grunde aber auch sehr langsam. Außerdem hat man bei Basic den Nachteil, daß es auf einem Fließkommazahlenformat aufbaut, das ungeeignet für schnelle Berechnungen ist.


    > Mein Tipp wäre, das vielleicht mal als Fernziel auf dem Schirm zu behalten,
    > aber erstmal mit was viiiiel einfacherem anzufangen. Der C64 bietet ja einiges
    > an Harwareunterstützung durch den VIC (Softscrolling, Tiles, Sprites, ...).
    > Damit kann man schon mal einiges machen, auch ohne die letzten Taktzyklen rauszuquetschen.
    Gute Idee. Wenn ich mich recht erinnere, hat mal ein Programmierer von Lucasfilm Games (Koronis Rift etc) in einem Interview gesagt, daß das Team nach der Gründung zunächst ein paar Minispiele programmierte, die nicht veröffentlicht worden sind, einfach nur, um ein Gefühl für die Programmierung zu bekommen. M. M. n. lohnt sich das Programmieren auf dem C64 immer noch, weil man mit einer anderen Art der Programmierung konfrontiert wird, die in einigen Punkten intensiver ist als bei der modernen Entwicklung in Hochsprachen. Auf einem kleinen System wie dem C64 ist der Algorithmus extrem wichtig, viel wichtiger als heute, wo vieles mit reiner Prozessorpower erschlagen werden kann. Daß die Programme für den C64 in den späteren Jahren immer besser wurden, lag ja nicht an einer Veränderung der Hardware, sondern allein an der weiterentwickelten Programmiertechnik.
    Die Programmierung in Assembler ist übrigens leichter als man oft denkt. Nach ein gewissen Zeit der Umstellung, in der man von sowohl der Freiheit als auch der damit verbundenen Orientierungslosigkeit im Zusammenhang mit dieser Sprache heimgesucht wird, macht es zunehmend Spaß, neue Sachen zusammenzubasteln. Es dauert schon eine ziemliche Weile, bis man an das Limit dieser kleinen Maschine stößt. Und dann geht es erst richtig los mit der Trickserei... Wenn ich eine Empfehlung geben darf: Es gibt inzwischen viele gute (Cross-)Assembler und sonstige Entwicklungswerkzeuge für den PC und natürlich einen Emulator wie VICE, mit deren Hilfe man recht zügig zu einem lauffähigen Programm kommen kann. Die direkte Programmierung auf dem C64 selbst legt einem viel Ballast bei der Entwicklung auf, ohne dadurch das Ergebnis an sich zu verbessern. Ich persönlich trenne daher zwischen Arbeitscomputer und Zielcomputer, weil es mir um das Resultat geht. Das haben die Programmierer früher in den 80ern aber häufig auch so gemacht. Ist also kein Sakrileg.


    Auf jeden Fall viel Spaß beim Programmieren!

  • Zitat


    > Hab mir überlegt, ob vllt. der C128 eine bessere Alternative darstellt?
    > Zumindest ist hier ja die CPU auf 2 MHZ getacktet , evtl. ist das bessere Basic auch von Vorteil ?
    Leider nicht. Bei der 2 Mhz-Taktung funktioniert der Videochip VIC nicht mehr, der aber für die Graphikdarstellung gebraucht wird. Der neue Videochip im C128 für die 80-Zeichendarstellung ist für die 3d-Darstellung nicht geeignet. Man kann allerdings beim C128 im C64-Modus die 2 Mhz-Taktung mittels Rasterinterrupt partiell einschalten, wenn sich der Rasterstrahl des VIC außerhalb des darzustellenden Bereichs befindet, um so ein bißchen mehr Leistung herauszukitzeln.
    Das Basic des C128 ist nicht von Vorteil. Es verfügt zwar über allgemein gehaltene Graphikbefehle, ist aus dem Grunde aber auch sehr langsam. Außerdem hat man bei Basic den Nachteil, daß es auf einem Fließkommazahlenformat aufbaut, das ungeeignet für schnelle Berechnungen ist.


    Dazu hätte ich noch mal eine Nachfrage. Warum ist der VDC nicht für 3D geeignet ?

  • Zitat von hawk66

    Dazu hätte ich noch mal eine Nachfrage. Warum ist der VDC nicht für 3D geeignet?


    Beim VIC liegt die Bitmap im normalen RAM und kann als Framebuffer halbwegs ausreichend schnell direkt von der CPU zugegriffen werden.


    Im Gegensatz dazu liegt das VDC RAM 'außerhalb' und ist direkt nur durch den VDC selbst zugreifbar, für den Bildschirmrefresh. Um das RAM von der CPU aus zu beschreiben oder zu lesen, müssen in zwei Register des VDC zunächst Low- und High-Byte der Adresse geschrieben werden, dann kann man über ein drittes Register auf das betreffende Byte im VDC RAM zugreifen.


    Allerdings ist noch nicht mal dieser Registersatz direkt ansprechbar: im Adreßraum der CPU existieren nur zwei Speicherstellen, eins gibt die Registernummer an, das andere den Inhalt dieses Registers. Darüberhinaus muß man vor einem Schreibzugriff in das Registernummern-Register erst lesend überprüfen, ob der VDC nicht gerade noch anderweitig beschäftigt ist (z.B. mit einer Kopieraktion).


    Diese doppelte Umlenkung sorgt nun nicht gerade für den tollsten Geschwindigkeitsschub. Textdarstellung geht halbwegs unproblematisch. Grafik (wegen mir auch 3D-Grafik) kann man auf dem Ding nur dann darstellen, wenn's einem nicht auf die Geschwindigkeit ankommt.

  • Hat einer von euch Erfahrung, wieviel Aufwand es ist, so was mit dem C64 zu realisieren? Mir fehlt da ein gesundes Bauchgefühl; ich vermute mal der Aufwand ist sehr gross; aber evtl. gibt es von der Community auch 'Libraries', Coding-Snippets?


    Naja. Also erstmal sollte man Mathe gut können, um überhaupt Vektorgrafig zu verstehen und ggf. in BASIC hinzubekommen. Jaa BASIC! In irgendeiner Happy Computer war ein Vektorgrafik-Würfel drehbar in BASIC geschrieben worden. Ging zumindest auf dem CPC. :)

  • Wieso am C64 und nicht am PC?
    Hast Du das in C oder sonst einer Sprache am PC mal umgesetzt?
    Hast Du den Eindruck es waere am C64 einfacher weil er einfacher ist?
    Und wieso c128 der 2 Mhz wegen wenn Du den C64 willst weil er kleiner/langsamer/einfacher ist?
    Ich denke Du solltest erstmal etwas in 2D basteln.
    Wenn Du einen einfachen Bresenham am C64 realisiert hast, DANN kann man weiterdenken und optimieren und dann hast Du auch eine Grundvorstellung davon was der C64 so kann und was nicht.

  • also ich muss da enthusi recht geben, man sollte erstmal das einfachste am c64 versuchen das optimieren und dann
    schaun wo noch reserven uebrigbleiben. linien algorythmen giebet ja zu hauf aber aufn c64 hatt sich der bresenham
    als effektivster herrausgestellt(so denke ich als unwissender, und am pc wuerde man wohl eher DDA benutzen
    da die architektur da mehr zulaesst (vom power und befelssatz her)).
    wenn man erstmal was in 2d gemacht hatt dann isses nich mehr weit zu 3d aber der rechenaufwand erschlaegt
    den kleinen commodore doch sehr. :/ schon alleine ein pixel zu setzen ist ja nicht so trivial wie man denken wuerde,
    das ist auf vga systemen einfach einfacher; aber wir sind hier ja nicht bei vga sondern bei commodore.


    von daher rate ich auch eher erstmal zu einfachen sachen wie rasterbars, 2d graphiken, sprites, text und
    graphik modes in einem screen. erst wenn man das drauf hatt kann man evtl an 3d denken.


    salute

  • aber aufn c64 hatt sich der bresenham
    als effektivster herrausgestellt

    <klugscheißermodus>
    Nicht unbedingt. So verwenden z. B. die Spiele "Elite", "Starglider" oder "Battle Command" durchaus DDA auf dem C64, mit unterschiedlicher Genauigkeit. Was man jetzt selbst verwenden will, ist so eine der Fragen in puncto Algorithmus, die man halt beantworten muß, wenn man auf dem C64 3d programmieren will.
    </klugscheißermodus>