3D-Grafik in V2 BASIC

Es gibt 34 Antworten in diesem Thema, welches 8.276 mal aufgerufen wurde. Der letzte Beitrag (9. Oktober 2015 um 07:41) ist von Tale-X.

  • Und nu viel Spaß beim knacken der 30:00er Marke - im Array- statt Poke-Thread gibt's einen Tipp dafür.


    ...der brachte aus irgendwelchen Gründen nur noch ca. 5 Sekunden... :nixwiss:.

    Außerhalb der Haupt-Routine könnte ich noch drei Sekunden 'rausboxen' (Screen to Bitte melde dich an, um diesen Link zu sehen.). Ist aber nur Erbsenzählerei gegen:

    bin jetzt beim Hut bei 21:56 Minuten Laufzeit... in Basic


    :zustimm:.


    Du bist echt ein krasser Neuzugang, und dann noch in der Basic-Ecke :applaus: .

    P.S.: Ich hab' zur Zeit noch eine "Print2Bitmap"-Sache am Wickel. Vielleicht vertragen sich die beiden ja irgendwie... :winke:

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

    Ex-TLI (The Level 99 Industries) & Ex-TNP (The New Patriots) & Ex-TEA (The East Agents) & ?

  • Ich find das ebenfalls geil dass sich hier wirklich viele fähige Menschen auf ein und demselben Forum finden die tolle Sachen erschaffen und besser machen. :dafuer: Und dass es mehr werden.

    Und klar, der seelische Druck Assembler zu lernen ist auf dem C64 wohl am größten. :anonym
    Sonst würde ich mich nicht freiwillig durch die Adressierungsarten und lda, dex, bne und den ganzen Kram kämpfen.

  • Danke... ich hoffe, dass mir auch produktive Dinge noch einfallen.

    @HexWorks: worum geht es bei Print2Bitmap?

    So, ich bin jetzt bei 20:43 und damit vermutlich am Ende der Möglichkeiten (lass mich aber gerne vom Gegenteil überzeugen, vor allem, wenn jemand die Kosinusreihe "entschärft" bekommt).

    Was gibt's zu sagen - Kosinus und Quadrat sei dank kann ich auch in y-Richtung die Hälfte der Berechnungen einsparen, muss hier die Werte merken.

    Problem:
    Beim Füllen des Arrays mit den Werten werden diese fröhlich in den Grafikspeicher geschrieben (deja vu? ;) )

    Lösung:
    Ein Leerarray vorneweg das dafür sorgt, dass die Werte im Speicher hinter der Grafik liegen. Bekannter Warnhinweis - danach keine neuen Variablen einfügen (bzw. nicht nach dem ersten Pixel).

    Damit das Leerarray nicht ganz unnütz ist, lege ich dort die Speicheradressen der Zeilen für die Grafikroutine ab (ersetzt li) - diesmal für alle 200 y-Werte. Beim Wechsel in die zweite Hälfte wird die Bildschirmrahmenfarbe gewechselt und er greift nur noch auf die zwischengespeicherten Ergebnisse zu

  • So langsam spamme ich das Forum :S Unter 20 Min -> y-Werte sind stets zwischen 0 und 255. Da braucht's kein Array, da reicht Byte und damit Poke...

  • So langsam spamme ich das Forum :S Unter 20 Min -> y-Werte sind stets zwischen 0 und 255. Da braucht's kein Array, da reicht Byte und damit Poke...


    Nö das ist kein Spam. Es kommt doch was neues an Erkenntnissen dabei rum. Also weiter so. :ilikeit:

    Bitte melde dich an, um diesen Anhang zu sehen. :verehr: .: Mit Bitte melde dich an, um dieses Bild zu sehen.wäre das nicht passiert! :. :prof:  Bitte melde dich an, um diesen Anhang zu sehen.

    :syshack: .: Meine 3D-Drucker Teile auf :. Bitte melde dich an, um diesen Link zu sehen. :strom:

  • So langsam spamme ich das Forum :S Unter 20 Min -> y-Werte sind stets zwischen 0 und 255. Da braucht's kein Array, da reicht Byte und damit Poke...

    :abgelehnt

    Das Teil funktioniert nicht.
    :schande:

    Wissen ist das einzige Gut, das sich beim Teilen vermehrt. Also seid vorsichtig damit!

  • So, und nochmal eine funktionierende Beschleunigung, allerdings zu Lasten der Bildqualität. Diesmal baue ich zu Anfang eine Wertetabelle mit 512 Einträgen, die den Bereich von 0 bis 2pi abdeckt - alles was außerhalb des Bereichs liegt, kann darauf zurückgerechnet werden ((Wert*512)/(2*pi))AND511.
    Hinzufügte Variablen:
    cv(512) - Array für Zwischenwerte
    cf - Umrechnungsfaktor Winkelfunktion -> Array (2pi/512)
    ct - Temporäre Variable beim Befüllen des Arrays
    by - Wert 511 (für AND-Verknüpfung)

    Zur Initialisierung wird in Zeile 10 das Unterprogramm ab Zeile 100 aufgerufen. Dort wird die Wertetabelle befüllt und die FNC-Funktion definiert (DEF FNC(x)...). Die FNC-Funktion wird dann in der Hauptfunktion (Zeile 21) statt der COS-Funktion verwendet.

    Code
    100 fort=0to128
    130 ct=cos(t*cf)
    140 cv(t)=ct
    150 cv(512-t)=ct
    160 cv(256-t)=-ct
    170 cv(256+t)=-ct
    180 next
    190 def fnc(x)=cv((n5+x/cf)andby)
    200 return

    Ergebnis: 18:28 (statt ursprünglich >50 Minuten)

    Wenn n5 aus Zeile 190 rausgenommen wird, ist's knapp über 18 Minuten (allerdings mit etwas ausgefransteren Kurven). Durch Auflösen der FNC-Aufrufe in der Hauptfunktion (f=fnc(r)-fnc(3*r)/3...) lässt sich sicherlich die Zeit noch auf unter 18 Minuten drücken. Ich hab' jetzt aber erst mal genug von Hüten ;)

    Nachtrag: die Wertetabelle für die Cosinus-Werte definiere ich NACH dem Array das den Grafikspeicher überbrückt, ansonsten ragt sie in den Grafikbereich rein. Außerdem musste ich das Grafikspeicher-Array verkleinern - sonst out of memory (endlich hab' ich ein Programm geschrieben, dass den ganzen Speicher nutzt :thumbsup: ). Auch der Code darf nicht zu lang werden, sonst ragt was in die Grafik rein...


  • Diese Wertebereichsumrechnung von von 512 <-> 2*PI macht da den Tabellenvorteil irgendwie zunichte. Ich hätte mir da mehr Potential in dieser Optimierung versprochen. Das gesamte Mapping (schon "r") könnte sich da an 0-511 orientieren ...

  • Stimmt, da hast Du recht *grübel* Reicht es, den Faktor bei r unterzubringen, oder ggf. noch weiter vorne *grübel*

    Wissen ist das einzige Gut, das sich beim Teilen vermehrt. Also seid vorsichtig damit!

  • So, ich hatte jetzt im ersten Anlauf den Faktor cf zu r "hochgezogen", hab allerding auch nen kleinen Bock eingebaut

    Code
    20 forx=.toxp:r=sqr(x*x/sf+yq/vz)/cf 
    190 def fnc(x)=cv(n5+(xandby))


    Der Code wurde dadurch etwas schneller - 17:45

    Nachdem ich n5 entfernt habe war die Formel so kurz, dass ich sie in die Hauptfunktion eingesetzt habe (p(y,x)=... ist jetzt in der nächsten Zeile). Eine weitere Optimierung betrifft Zeile 20: Der Umrechnungsfaktor cf ist konstant, genauso wie sf und vz - kann ich also gleich in sf und vz einrechnen (beide werden auch nirgendwo anders verwendet). Dadurch kein Mehraufwand mehr in der Schleife für das Umrechnung 2pi->512!

    Code
    ...
    7 m7=504:e4=40:cf=2*./512:by=511
    8 yl=200:n1=-1:n5=.5:nh=900:eh=100:hs=160:sf=3136*cf*cf:vz=196*cf*cf:s=1:a=7872
    ...
    20 forx=.toxp:r=sqr(x*x/sf+yq/vz)
    21 f=cv(randby)-cv((3*r)andby)/3+cv((5*r)andby)/5-cv((7*r)andby)/7
    22 p(y,x)=int(e4*f+n5):fl=.:xp=hs+x-y:yp=eh+y+y-p(y,x)
    ...
    190 rem entfaellt

    Aktuelle Durchlaufzeit: 16:46

  • Sehr schön.

    Verträgt scheinbar leider mit keinem Compiler (Blitz, Boss, Austro getestet). Hätte mich ja mal interessiert.

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

    Ex-TLI (The Level 99 Industries) & Ex-TNP (The New Patriots) & Ex-TEA (The East Agents) & ?

  • Was passiert genau - stürzt es ab, ist die Grafik Müll?

    Ich würde pauschal vermuten, dass die Arrays bei den letzten Fassungen das Problem sind, der verfügbare Basicspeicher ist da ziemlich aufgebraucht. Versuch mal die Fassung hatformel2.prg von weiter oben. Wenn die geht, könnte man da mit dem Kosinusersatz rangehen und das dann durch den Compiler jagen.

    Wissen ist das einzige Gut, das sich beim Teilen vermehrt. Also seid vorsichtig damit!

  • Austro und Blitz (basiert wohl auf Austro) verarbeiten es zwar ohne Fehler, steigen beim Kompilat aber gleich mit 'Out of Memory' aus.

    Boss sagt:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Das andere teste ich gleich nochmal.

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

    Ex-TLI (The Level 99 Industries) & Ex-TNP (The New Patriots) & Ex-TEA (The East Agents) & ?

  • Meintest du die "hat-final2.prg" aus Beitrag Bitte melde dich an, um diesen Link zu sehen.? Läuft auch nicht...

    "hatsub-20.prg" aus Bitte melde dich an, um diesen Link zu sehen. steigt mittendrin aus und hat gleich zu Anfang oben Pixelfehler:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Austro und Blitz sehen so aus:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Schade. Ich geb's auf :winke:

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

    Ex-TLI (The Level 99 Industries) & Ex-TNP (The New Patriots) & Ex-TEA (The East Agents) & ?

  • Ich meinte schon hatformel2.prg ;) - sehe gerade, dass steht noch auf der ersten Seite - das hat noch nicht die beiden großen Arrays (l() und p()) drin. Das sollte auf jeden Fall funktionieren.

    Den Screenshots nach sind die kompilierten Programme größer bzw. weiter hin im Speicher. Die "Wellen" im Screenshot vom Austro kenne ich auch von meinen Experimenten - das sind die Arrays. Beim anderen Screenshot würde ich pauschal tippen, dass im Bildschirmspeicher der Programmcode zu sehen ist.

    Wissen ist das einzige Gut, das sich beim Teilen vermehrt. Also seid vorsichtig damit!