Sprite Verschiebung beschleunigen

  • Sprite Verschiebung beschleunigen

    Hallöchen zusammen,
    ich hab mich nun auch mal ein wenig mit Basic beschäftigt, das letzte Mal ist ~15 Jahre her und damals war das QBasic.

    Das Problem: Ich habe mehrere Multicolor Sprites (7 Stück die alle die selbe Form haben) und möchte diese auf dem Bildschirm in y-Richtung verschieben.
    Dazu ändere ich die aktuellen y-Werte entsprechend ab und poke sie wieder rein. Es wird also eigentlich nicht mehr gemacht wie ständig mittels der Schleife die Werte zu verändern.

    Quellcode

    1. 199 sm=2:sp=1:ss=-2:mx=225:bs=5:id=0
    2. 210 for g=0 to 6
    3. 211 :id = g*sm
    4. 214 :za = peek(53251+id)-(sp*g)-ss:if za<20 then za=za+mx
    5. 215 :if za > 254 then za=za-mx
    6. 216 :poke 53251+id,za: next g
    7. 218 goto 210
    Nur dieses Verschieben dieser 7 Sprites ist schon sehr langsam, gibt es da nun noch einen Trick um das ganze etwas zu beschleunigen? Ich habe sogar schon Doppelpunkte eingebaut, in der Hoffnung das könnte etwas helfen :D . Gibt es da vielleicht noch ein paar Register im VIC die mir dabei helfen die Verschiebung der Sprites zu beschleunigen. Klar könnte man das auch in Assembler realisieren wenn man Assembler kann, aber es soll in Basic sein. Das Programm zu compilieren geht natürlich auch, aber ich möchte erstmal direkt im Basic Interpreter noch soweit es geht optimieren.

    Danke schonmal für etwaige Tipps.
    Experto credite - 3d-druck-community.de
  • Schwierig, wenn die nicht alle in der gleichen Höhe liegen.

    Du kannst die IFs da mit automatischem Rechnen zusammenlegen, das wird aber nicht unbedingt schneller dadurch.

    Was immer du kannst, vorberechnen und ggf. Werte direkt einsetzen.

    Evtl. das Berechnung und Setzen aufteilen, damit wenigstens das Setzen "am Stück" erfolgt.
  • - Leerzeichen und Doppelpunkte natürlich weg...
    - 53251 als Variable definieren (bringt relativ viel!)
    - einstellige Variablen
    - mehr in eine Zeile zwängen
    - 'next' statt 'next g'
    - wofür ist SP=1 gut?
    Read'n'Blast my jump'n'stop-text-sprite-scroller Select A Move

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

    Hallöchen zusammen,
    ich hab mich nun auch mal ein wenig mit Basic beschäftigt, das letzte Mal ist ~15 Jahre her und damals war das QBasic.

    Das Problem: Ich habe mehrere Multicolor Sprites (7 Stück die alle die selbe Form haben) und möchte diese auf dem Bildschirm in y-Richtung verschieben.
    Dazu ändere ich die aktuellen y-Werte entsprechend ab und poke sie wieder rein. Es wird also eigentlich nicht mehr gemacht wie ständig mittels der Schleife die Werte zu verändern.

    Quellcode

    1. 199 sm=2:sp=1:ss=-2:mx=225:bs=5:id=0
    2. 210 for g=0 to 6
    3. 211 :id = g*sm
    4. 214 :za = peek(53251+id)-(sp*g)-ss:if za<20 then za=za+mx
    5. 215 :if za > 254 then za=za-mx
    6. 216 :poke 53251+id,za: next g
    7. 218 goto 210
    Nur dieses Verschieben dieser 7 Sprites ist schon sehr langsam, gibt es da nun noch einen Trick um das ganze etwas zu beschleunigen? Ich habe sogar schon Doppelpunkte eingebaut, in der Hoffnung das könnte etwas helfen :D . Gibt es da vielleicht noch ein paar Register im VIC die mir dabei helfen die Verschiebung der Sprites zu beschleunigen. Klar könnte man das auch in Assembler realisieren wenn man Assembler kann, aber es soll in Basic sein. Das Programm zu compilieren geht natürlich auch, aber ich möchte erstmal direkt im Basic Interpreter noch soweit es geht optimieren.

    Danke schonmal für etwaige Tipps.
    Probiers mal so, gibt jedenfalls einen Geschwindigkeitsschub:

    Quellcode

    1. 199 sp=1:ss=-2:mx=225:bs=5:i=0:v=53261:forh=.to2:h=.:fOg=.to6
    2. 210 i=g+g:t=v+i:z=pE(t)-(sp*g)-ss:z=z-mx*(z<20):z=z+mx*(z>254):pOt,z:nEg,h
    Zeilen 211 bis 218 sind dann überflüssig. Geändert habe ich:
    • sm=2 entfernt und in Zeile 210 durch g+g ersetzt
    • Variable id durch i ersetzt
    • Variable za durch z ersetzt
    • Variable v mit Wert 53261 eingefügt (Zeile 199) und Code in Zeile 210 dadurch verkürzt
    • die 2 IF...THEN Anweisungen durch Logische Berechnungen ersetzt. IF ist sehr lansam, probiers aus ;)
    • GOTO durch eine Endlos-FOR...NEXT-Schleife ersetzt (und H als Variable dafür eingesetzt)
    Da das komplette Programm hier leider fehlt, kann ich nicht testen, wie schneller das Programm dadurch wurde.

    Anmerkung zu den logischen Berechnungen: das BASIC gibt 0 für Unwahr und -1 für Wahr raus. Da - und - gleich + ergibt, wird so der Zähler höher gesetzt.
  • Für schnelles Verschieben von Sprites kann man auch Strings mit den Sprite-Koordinaten vordefinieren oder mit Stringaddition zusammensetzen.

    Die überträgt man dann mit einer Kopieraktion in den VIC.

    Das ergibt dann meiner Meinung nach die saubersten Ergebnisse.

    Schönen Gruß.
  • Hier ein kleiner Beispielcode für das Bewegen von 8 Sprites.

    Nach der Spriteinstallation in Zeile 12-13 werden die Sprite-Koordinaten in die Variable c$ gespeichert und dann mit string-copy nach 53248 kopiert.


    10 : rem---sprites.bewegen
    11 :print"[clr]sprite-schau"
    12 :a=15:forb=peek(648)*256+1016tob+7:pokeb,a:next:k=1:y=80
    13 :forb=a*64tob+63:pokeb,255:next
    19 :
    20 :a=53248:i=.
    21 :c$="":forj=.to7:x=24+j*24:c$=c$+chr$(x)+chr$(y):next:gosub30:poke53269,255
    22 :geta$:ifa$=""then:y=y+k:i=i+1:on-(i<40)goto21:k=-k:goto20
    26 :poke53269,.:list
    29 :
    30 :rem---string-copy(c$,a)
    31 :poke782,peek(35+(c$<"")):poke781,peek(34+(c$<"")):poke780,len(c$)
    32 :poke54,a/256:poke53,a-peek(54)*256:sys46728:return

    Schönen Gruß.
  • Das würde aber 'mal wieder kein normaler Mensch so eintippen oder programmieren. ;) Falls es überhaupt lauffähig ist u. nicht an jeder 2. Ecke abbricht.
    (Diese ganze Befehlsorgie -len + String + Rechnerei- ist sicherlich auch nicht schneller, als ein normales und kürzeres a=a+1:If... .)
    ' war Anfang 2000 schonmal unter dem Kennnamen 'c64fan' hier unterwegs.
  • Vielen Dank an euch für die vielen Tipps und Tricks, die muss ich nun erstmal aufarbeiten, die ein oder anderen Dinge hab ich schon realisiert und es läuft zwar immer noch langsam, ist halt Basic, aber schon merklich schneller als davor! Super Sache :thumbsup:
    Bin echt erstaunt was man an diesem einfachen Code noch alles optimieren kann 8|
    Experto credite - 3d-druck-community.de
  • zumili schrieb:

    Vielen Dank an euch für die vielen Tipps und Tricks, die muss ich nun erstmal aufarbeiten, die ein oder anderen Dinge hab ich schon realisiert und es läuft zwar immer noch langsam, ist halt Basic, aber schon merklich schneller als davor! Super Sache :thumbsup:
    Bin echt erstaunt was man an diesem einfachen Code noch alles optimieren kann 8|
    Mich würde dein Programm ja mal interessieren. Kannst du deine Sprites plus Code hier mal anhängen? Vielleicht kann ich dir da ja weiterhelfen. Gerade was BASIC betrifft, versuch ich bei meinen Spielen den Code so weit zu optimieren wie es nur geht.
  • Hi RKSoft,

    ich muss mich erstmal dransetzen und den ganzen Code etwas besser strukturieren, ist mein erstes Programm in Basic seit gut 15 Jahren und genau so sieht es momentan auch noch aus :D. Wenn ich das so wie es gerade ist hier reinstellen würde, wäre der Hohn und Spott sehr groß und ich mach mich zum Affen damit :D.

    Neben dem reinen Verschieben der Sprites wie oben schon gezeigt, werden nun auch noch diverse Überprüfungen auf Tastendrücke bzw. Joystickeingaben und Variablenprüfungen durchgeführt, welche die eigentliche Verschiebeung nun wieder verlangsamen.

    Daher benötige ich noch etwas Zeit das wenigstens etwas aufzuräumen und noch selbst ein paar Optimierungen einzubauen bevor ich das dann auf euch loslasse.
    Experto credite - 3d-druck-community.de
  • zumili schrieb:

    Hi RKSoft,

    ich muss mich erstmal dransetzen und den ganzen Code etwas besser strukturieren, ist mein erstes Programm in Basic seit gut 15 Jahren und genau so sieht es momentan auch noch aus :D. Wenn ich das so wie es gerade ist hier reinstellen würde, wäre der Hohn und Spott sehr groß und ich mach mich zum Affen damit :D.

    Neben dem reinen Verschieben der Sprites wie oben schon gezeigt, werden nun auch noch diverse Überprüfungen auf Tastendrücke bzw. Joystickeingaben und Variablenprüfungen durchgeführt, welche die eigentliche Verschiebeung nun wieder verlangsamen.

    Daher benötige ich noch etwas Zeit das wenigstens etwas aufzuräumen und noch selbst ein paar Optimierungen einzubauen bevor ich das dann auf euch loslasse.
    Kann ich verstehen ^^. Dann hau das erstmal fertig und zeig uns dann deinen fertigen Code/fertiges Spiel bitte. Freu mich, wenn jemand weiteres in BASIC programmiert. So schlecht ist die Sprache ja nun auch nicht, wie immer gern gesagt wird.
  • @Hexworx und @zumili:
    Das von mir gepostete Programm ist ja nur ein Beispielprogramm, das immerhin 8 Sprites gleichzeitig setzen kann.

    Wer aber natürlich meine Veröffentlichungen zur Garbage-Collection-Vermeidung oder Feststringverwaltung verfolgt hat, der kann zu Recht vermuten, daß das Spritesetzen mit Strings auch noch erheblich schneller machbar ist.

    Schönen Gruß.