Meine Fresse ne, da ist man mal neugirieg gewesen und hat denn den Raytracer probiert und selbst mit Vice im Warp Modus bei 8000% dauert das ewig .
Hallo Besucher, der Thread wurde 18k mal aufgerufen und enthält 140 Antworten
letzter Beitrag von BIF am
Plot-Routine für Basic V2
- Bytebreaker
- Erledigt
-
-
Zitat von Bytebreaker
[...]das kriecht arg, ist halt BASIC.
Na, ja, wenn man dann ausgerechnet in der Punktsetz-Routine noch "2^" benutzt, um den Bitwert auszurechnen, wird's auch nicht gerade schneller. Tabellen sind da das Mittel der Wahl (auch in MCode).Zitat von BIFDafür muß man erst einmal rausfinden, was der Programmierer überhaupt bezweckt.
Muahaha! Das sagt gerade der Richtige!...
Ich hab' hier gerade mal ein kleines Grafikdemo vom VC-20 herübergeholt. Auf dem VC nutzt es die BASIC-Erweiterung MINIGRAFIK und darum konnte ich mich dort auf die Mathematik konzentrieren. Ohne BASIC-Erweiterung auf dem C64 sieht's halt *etwas* umständlicher aus. Ja, und wegen der Zeilen 31 bis 36: ich weiß, wie Bresenham geht.
Code- 10 DIMBI(7),LI(24)
- 11 S=1:FORT=0TO7:BI(7-T)=S:S=S+S:NEXT
- 12 FORT=0TO24:LI(T)=8192+320*T:NEXT
- 13 :
- 14 DIMX(11),Y(11),L(12,1)
- 15 A=1.0:INPUT"ANGLE";P0:P0={PI}*P0/180
- 16 FORT=0TO11:READX(T),Y:Y(T)=SQR(3)*Y:NEXT
- 17 FORT=0TO12:READL(T,0),L(T,1):NEXT
- 18 POKE53265,59:POKE53272,24:POKE53280,14
- 19 FORT=8192TO16191:POKET,.:NEXT
- 20 FORT=1024TO2023:POKET,22:NEXT
- 21 P=P0:GOSUB24:P=P0+2*{PI}/3:GOSUB24:P=P0-2*{PI}/3:GOSUB24
- 22 FORQ=-1TO0:GETA$:Q=A$="":NEXT:SYS58648:END
- 23 :
- 24 C=COS(P):S=SIN(P):FORT=0TO12
- 25 L=L(T,0):GOSUB29:X1=X2:Y1=Y2
- 26 L=L(T,1):GOSUB29:GOSUB31
- 27 NEXT:RETURN
- 28 :
- 29 X2=INT(7*(C*X(L)-S*Y(L))/A+160.5):Y2=INT(100.5-7*(S*X(L)+C*Y(L))):RETURN
- 30 :
- 31 DX=X2-X1:DY=Y2-Y1:IFDX=0ANDDY=0THENX=X1:Y=Y1:GOTO38
- 32 IFABS(DX)<ABS(DY)THEN35
- 33 M=DY/DX:B=Y1-M*X1+.5
- 34 FORX=X1TOX2STEPSGN(X2-X1):Y=M*X+B:GOSUB38:NEXT:RETURN
- 35 M=DX/DY:B=X1-M*Y1+.5
- 36 FORY=Y1TOY2STEPSGN(Y2-Y1):X=M*Y+B:GOSUB38:NEXT:RETURN
- 37 :
- 38 AD=LI(Y/8)+8*INT(X/8)+(YAND7):POKEAD,PEEK(AD)ORBI(XAND7):RETURN
- 39 :
- 40 DATA 1,-1,3,-3,13,-3,8,2,4,2,7,-1,1,-5,11,-5,2,0,3,-1,0,-2,0,-4
- 41 DATA 0,1,1,2,2,3,3,4,4,5,5,0,1,6,6,7,7,2,4,8,8,9,0,10,6,11
- 42 :
- 43 REM ** C64 TRIBAR WRITTEN 2015-03-05 BY MICHAEL KIRCHER
-
Ich habe mir mal den Spass gemacht den Raytracer durch einen Basic Compiler zu jagen, nun ist er ein wenig schneller, vielleicht kann wer ja was mit anfangen.
-
-
Das Ergebnis-Bild ist schon beeindruckend.
Aber selbst das Kompilat läuft ja immer noch relativ langsam.
Da lohnt es sich wohl schon den Code zu optimieren.Schönen Gruß.
-
Habe den Code nur schnell mal durch denn Basic Boss Compiler gejagt unter Windows, das Compilat is etwa doppelt so schnell wie das Original im Warp Modus von Vice, habe es nun nicht gemessen aber so pi mal Auge ^^.
-
[offtopic]
Programme anderer Programmierer zu optimieren ist nicht immer ganz einfach.
100% ACK. Die meisten Programmierer hassen es, einen grösseren Umfang von bestehendem Code von anderen zu übernehmen um diesen zu verbessern/erweitern. Sich in eine fremde Codelogik einzudenken, ist nicht immer so banal, wie es sich Aussenstehende immer denken ("Du kann doch C++, da ist es doch kein Problem, dieses Feature im Code von Deinem Vorgänger einzufügen. Ist ja nur eine kleine Erweiterung. Kann nicht schwer sein, wieso dauert es so lange?!? Ich dachte, Du kannst C++ programmieren!!!")
Wenn es keine Kommentare im Code hat, die erklären wieso etwas gemacht wird so wie es gemacht wird, macht es die Sache nicht einfacher. Oder sinnfreie Kommentare wie:
Auch Möchtegern-"Optimierungen" haben heute einfach nichts im Code zu suchen, wenn sie keine wirkliche Funktionalität verbessern oder Anforderung erfüllen.
Wenn es um performancehungrige Applikationen oder Teile davon handelt, machen Optimierungen Sinn. Wenn es sich um allgemeine Desktop Anwendungen handelt, wo die CPUs eh nur Däumchen drehen, ist es kontraproduktiv für vermeintliche "Optimierungen" auf Sourcecode Lesbarkeit zu verzichten. Oft sind aber Optimierungen möglich, ohne die Lesbarkeit des Codes zu reduzieren. Es liegt aber eher an den (faulen) Programmierer, warum es aber nicht gemacht wird.Fünf undurchsichtig zusammengewurstelte Operationen in einer Zeile durchzuführen statt diese in übersichtliche 3 Zeilen aufzusplitten ist einfach nur dumm. Das mag früher unter knappen Ressourcen seine Daseinberechtigung gehabt haben, aber heute ist einfach nur noch kurzsichtig gedacht und ist oft der egozentrischen Persönlichkeit des Programmieres geschuldet.
Ich war schon oft selbst froh, wenn ich den Code gut strukturiert und dokumentiert habe, wenn ich diesen ein paar Jahre später selbst wieder pflegen musste. Aber es ist mir auch schon passiert, dass ich mir an den Kopf fassen musste und mich fragte "was habe ich mir damals denn gedacht?!? Wohl gar nichts!".
Dafür muß man erst einmal rausfinden, was der Programmierer überhaupt bezweckt.
Ja, das Problem habe ich auch bei Deinen Snipplets....
Mike:
Daß sich einige Leute dadurch überfordert fühlen, weil sich meine Listings meist nur auf einen einzigen Effekt beschränken, dafür hab ich natürlich Verständnis.Ach so, Wasser predigen und Wein saufen?
Darf ich noch ein Mal daran erinnern, wofür das Akronym BASIC steht? Beginner's All-purpose Symbolic Instruction Code, also eine einfache, für Anfänger geeignete Programmiersprache. Das impliziert in meinen Augen auch eine einfache Lesbarkeit, was wiederum impliziert, dass der Code zum Zwecke der besseren Verständlichkeit geplegt werden muss.
Oft erinnern mich Deine Beispiele an Perl being written by a programmer eating steroids.[/offtopic] -
Zitat von BIF
Daß sich einige Leute dadurch überfordert fühlen, weil sich meine Listings meist nur auf einen einzigen Effekt beschränken, dafür hab ich natürlich Verständnis.
Du hast dich da um eine Einheit vertan. Deine Programmfragmente beschränken sich in der Regel auf 0 Effekte.Zitat von SchlachtwerkHabe den Code nur schnell mal durch denn Basic Boss Compiler gejagt unter Windows, das Compilat is etwa doppelt so schnell wie das Original im Warp Modus von Vice, habe es nun nicht gemessen aber so pi mal Auge.
In anderen Fällen mit einer Fließkommaintensiven Anwendung (aber immer noch mit den Routinen im BASIC) geht im Regelfall der Faktor 3. Da macht sich der wegfallende Overhead der Ausdrucksauswertung im Interpreter gut bemerkbar.Evtl. bremst hier noch die SQR()-Funktion, wenn BASIC Boss die nicht mit dem Heron-Verfahren optimiert hat.
-
Grundsätzlich gibt es ja immer verschiedene Kenntnisstände.
z.B.
-die einen können lesen, die anderen können nicht lesen.
-die einen können rechnen, die anderen können nicht rechnen.
-die einen können Basic, die andern können nicht Basic.
-die einen können Maschinensprache, die anderen können keine Maschinensprache.Also, wenn jemand etwas nicht versteht, dann kann er ja auch mal fragen.
Schönen Gruß.
-
Nur dass in der Regel keine sinnvolle Antwort kommt...
-
Ja, die Erkenntnis kann eben nicht bei jedem sofort kommen.
Das hat die Natur so eingerichtet.Schönen Gruß.
-
Tolles Tribar!
Auch wenn das jetzt OT ist:
Wie kann man denn Textausgabe im Grafikmodus bewirken?
Dann könnte man Mikes Scroll-Routine nehmen und zugleich den Cevi etwas Schönes zeichnen lassen wie das Tribar. Der Scrolltext würde dadurch auch lesbarer werden, da verlangsamt.
Idealerweise noch ein SID dazu und schon hätte man ein Intro.Ich befürchte aber dass man da wohl Assembler braucht weil es zuviele Routinen sind, die zyklisch angesprungen werden müssen. Aber ohne Ton müsste es in Basic doch hinkriegbar sein - ohne dass da bunte Rechtecke scrollen sondern lesbare Buchstaben während sich das Tribar zeichnet.
-
Zitat von Bytebreaker
Wie kann man denn Textausgabe im Grafikmodus bewirken? Dann könnte man Mikes Scroll-Routine nehmen und zugleich den Cevi etwas Schönes zeichnen lassen wie das Tribar.
Zugegeben, das gemütliche Zeichnen der Linien hat schon irgendwie einen meditativen Effekt.Wenn man die Textausgabe in die Grafik hineinschreibt, dann müssen für jeden Schritt 320 Bytes bewegt werden. In BASIC geht das nicht gescheit. Alternativ kann man über Rasterinterrupts eine Zeile in den Textmodus schalten und darin die Laufschrift laufen lassen. Wenn man aber ohnehin schon soweit ist, kann die Rasterroutine das Scrollen der Laufschrift gleich mit übernehmen.
In der BASIC-Erweiterung geht das Einschalten der Grafik (incl. Bildschirmlöschen) und das Zeichnen der Linien dann so schnell, daß für einen Scroller wiederum nicht viel Text herumkommt, bis das Programm fertig ist. Ich hab die originale Version mal unten angehängt, nötig ist ein VC-20 mit mind. 8K Speichererweiterung.
BTT: Um herauszufinden, wie viel die SQR()-Funktion ausmacht, hab' ich sie mal durch meine Heron-Implementation ersetzt, und im Raytracer alle 4 Vorkommen von SQR() durch USR() ausgetauscht. USR() wird durch den nachfolgenden DATA-Loader neu definiert:
Code- 1 FORT=679TO753:READA:POKET,A:NEXT:POKE785,167:POKE786,2
- 2 DATA 32,27,188,32,43,188,240,66,16,3,76,72,178,165,97,133,251,41,1,9,128,133
- 3 DATA 97,169,4,133,252,162,242,160,2,32,212,187,169,188,160,185,208,18,162,247
- 4 DATA 160,2,32,212,187,169,242,160,2,32,15,187,169,247,160,2,32,103,184,198,97
- 5 DATA 198,252,208,229,165,251,74,105,64,133,97,96
Code- .Sqrt
- JSR $BC1B ; FAC#1 runden
- JSR $BC2B ; Vorzeichen von FAC#1 prüfen
- BEQ Sqrt_03 ; =0? Dann sofort beenden! (SQR(0)=0)
- BPL Sqrt_00 ; weiter, wenn positiv, sonst
- JMP $B248 ; ?ILLEGAL QUANTITY ERROR anzeigen
- .Sqrt_00
- LDA $61
- STA $FB ; Exponent-Byte des Arguments merken
- AND #$01
- ORA #$80
- STA $61 ; Argument X auf den Bereich [0.5,2.0[ reduzieren
- LDA #$04
- STA $FC
- LDX #Sqrt_04 MOD 256
- LDY #Sqrt_04 DIV 256
- JSR $BBD4 ; FAC#1 nach Sqrt_04 (X: reduziertes Argument) speichern
- LDA #$BC
- LDY #$B9
- BNE Sqrt_02 ; mit Y=1 als erste Annäherung starten,
- .Sqrt_01 ; und Schleife 4x ausführen, dabei jedesmal Y=(Y+X/Y)/2.0 berechnen
- LDX #Sqrt_05 MOD 256
- LDY #Sqrt_05 DIV 256
- JSR $BBD4 ; FAC#1 nach Sqrt_05 (Y: Zwischenergebnis) speichern
- LDA #Sqrt_04 MOD 256
- LDY #Sqrt_04 DIV 256
- JSR $BB0F ; FAC#1 = X/Y
- LDA #Sqrt_05 MOD 256
- LDY #Sqrt_05 DIV 256
- .Sqrt_02
- JSR $B867 ; FAC#1 = Y+X/Y (=1+X beim ersten Einsprung)
- DEC $61 ; FAC#1 durch 2 teilen
- DEC $FC
- BNE Sqrt_01
- LDA $FB ; Exponent des Ergebnisses ausrechnen
- LSR A
- ADC #$40
- STA $61
- .Sqrt_03
- RTS
- .Sqrt_04
- EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0
- .Sqrt_05
- EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0
Tja, letztendlich brachte das dann doch nicht soviel. Statt 30 Stunden waren es nur noch 28.Ich hab' die beschleunigte SQR-Routine trotzdem auch mal mit angehängt.
-
Tolles Tribar!
Auch wenn das jetzt OT ist:
Wie kann man denn Textausgabe im Grafikmodus bewirken?
Dann könnte man Mikes Scroll-Routine nehmen und zugleich den Cevi etwas Schönes zeichnen lassen wie das Tribar. Der Scrolltext würde dadurch auch lesbarer werden, da verlangsamt.
Idealerweise noch ein SID dazu und schon hätte man ein Intro.Ich befürchte aber dass man da wohl Assembler braucht weil es zuviele Routinen sind, die zyklisch angesprungen werden müssen. Aber ohne Ton müsste es in Basic doch hinkriegbar sein - ohne dass da bunte Rechtecke scrollen sondern lesbare Buchstaben während sich das Tribar zeichnet.
Oder Du bleibst bei BASIC und verwendest eine BASIC Erweiterung, die sowas kann. IRQ BASIC scheint sowas zu können. Ausprobiert habe ich es nicht. -
IRQ Basic und Handbuch hab ich mir runtergeladen.
Mal sehen was ich damit anfangen kann.Ich werde aber, sobald ich das Buch "Wunderland der C64 Grafik" durch habe, mit Assembler anfangen. Man stößt imme röfter an Grenzen je mehr man sich beschäftigt.
Aus methodischen Gründen mach ich aber das eine Buch noch zu Ende. Sogar da drin fängt der Autor dann mit Assembler an und stellt seine eigene Grafik-Erweiterung vor. -
Gibts dafür nen Compiler ?
-
[offtopic]Weil wir gerade zu den BASIC Optimierungen und ASM-Aufsteiger eingegangen sind, etwas Halb-OT:
Heute im Buch BASIC 7.0 auf dem Commodore 128 (Markt & Technik), Seite 12/13 gelesen und gelacht:ZitatStellen Sie sich jetzt einmal vor, Sie müßten Ihren Computer mit Bits und
Bytes füttern oder programmieren und sollten auf dieser untersten Maschinenebene
die Zahlen 4.8 und 13.5 miteinander multiplizieren. Sicher
würden Sie bald die Lust verlieren und das Ergebnis schneller im Kopf
ausrechnen, ganz abgesehen davon, daß Sie fundierte Kenntnisse in der
Maschinenprogrammierung benötigten und diese auch fehlerfrei anwenden
müßten. Für spezielle Anwendungsgebiete wird diese Programmierungsart
zwar noch gelegentlich eingesetzt, aber darauf soll in diesem Buch nicht
weiter eingegangen werden.[/offtopic]
Gibts dafür nen Compiler?
Jetzt lass doch den Mann das Ding mal ausprobieren, ob's denn sein Problem löst (würde mich auch interessieren), bevor wir mit BIF'sche Optimierungen und Compilate anfangen.
-
Aber Aber Aber Compiler sind doch WICHTIG
-
Aber Aber Aber Compiler sind doch WICHTIG
Wenn IRQ BASIC Rasterzeilen-Splits beherrscht, um den Bildschirm zu teilen, wird es wohl nicht gerade wie eine V2 Schnecke sein.
Ist dann fraglich, wieviel man mit einem Compiler noch rausholen kann.
Dann kann man ja gleich alles in ASM anfangen. Aber Bytebreaker will es ja mal so ausprobieren und es interessiert mich, was dabei rauskommt. -
Speed is toll, aber hauptsächlich finde ich es immer lästig wenn man extra ne Basic erweiterung vorher laden muss um was zu starten, deswegen der Schrei nach einem Compiler ^^.