Grafik in der Schleife px/py optimieren.
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
funkheldBetreff: Grafik in der Schleife px/py optimieren. |
Do, Aug 25, 2016 11:50 Antworten mit Zitat |
|
---|---|---|
Hallo, guten Tag.
Ich habe mal ein Test gemacht mit einem PIX zu beschreiben 500x500 PIxel. Dabei kam raus das das reine Basicprogramm nur ca 100 ms länger brauchte zum direkten beschreiben auf meinem Gerät wie ein Programm mit einem C-Modul oder wie ein Programm mit einem ASM-Modul. Wie könnte man nur aus der For/Next px/py noch 100 ms rausholen oder die Schleife anders umsetzen? Das reine Basic Programm : Code: [AUSKLAPPEN] Graphics 600,600 Global bild:TImage=CreateImage(500,500) global Pix:TPixmap=LockImage(bild) global Adresse:byte Ptr = Pix.PixelPtr(0,0) global f:int,z1:int,px:int,py:int global startm:int,endm:int f=$ffffff00 z1=0 startm= MilliSecs() Repeat Cls for py=0 to 500 for px=0 to 500 pix=LockImage(bild) writepixel(pix,px,py,f) unlockimage(bild) next next setcolor 255,255,255 DrawImage bild,10,10 z1=z1+1 drawtext z1,10,520 Flip Until z1=200 endm= MilliSecs() drawtext endm-startm ,10,540 flip waitkey Das Basicprogramm mit dem C-Import : Code: [AUSKLAPPEN] Import "c_pixel2.c" Graphics 600,600 Global bild:TImage=CreateImage(500,500) global Pix:TPixmap=LockImage(bild) global Adresse:byte Ptr = Pix.PixelPtr(0,0) global f:int,z:int,z1:int global startm:int,endm:int Extern Function pixel(Adresse:byte Ptr,z:int,f:int) End Extern f=$ff0000ff z=250000 z1=0 startm= MilliSecs() Repeat Cls pix=LockImage(bild) pixel(adresse,z,f) unlockimage(bild) setcolor 255,255,255 DrawImage bild,10,10 z1=z1+1 drawtext z1,10,520 Flip Until z1=200 endm= MilliSecs() drawtext endm-startm ,10,540 flip waitkey Das C-Modul: Code: [AUSKLAPPEN] int b; void pixel(int *adresse, int z, int f) { for(b=0; b<z; b++) { adresse[b]=f; } } Das Basicprogram mit dem ASM-Import: Code: [AUSKLAPPEN] Import "asm_pixel.s" Graphics 600,600 global z:int,f:int,z1:int Global bild:TImage=CreateImage(500,500) global Pix:TPixmap=LockImage(bild) global Adresse:byte Ptr = Pix.PixelPtr(0,0) global startm:int,endm:int Extern Function pixel(Adresse:byte Ptr,z,f) End Extern f=$ffff00ff z=250000*4 z1=0 startm= MilliSecs() Repeat Cls pix=LockImage(bild) pixel(adresse,z,f) unlockimage(bild) setcolor 255,255,255 DrawImage bild,10,10 z1=z1+1 drawtext z1,10,520 Flip Until z1=200 endm= MilliSecs() drawtext endm-startm ,10,540 flip waitkey Das ASM-Modul: Code: [AUSKLAPPEN] ;asm_pixel.s format MS COFF Public _pixel _pixel: mov eax,[esp+4] mov ebx,[esp+8] mov ecx,[esp+12] .weiter: mov [eax],ecx add eax,4 sub ebx,4 jne .weiter ret |
||
DAK |
Do, Aug 25, 2016 12:38 Antworten mit Zitat |
|
---|---|---|
Du kannst das Lock/Unlock um die Schleife herumsetzen. Also zuerst locken, dann alle Änderungen machen, dann unlocken. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
Midimaster |
Do, Aug 25, 2016 13:50 Antworten mit Zitat |
|
---|---|---|
in deine Zeitmessung fließen zuviele Nebeneffekte mit ein. Besser wäre es das reine Assemblerstück zu messen und mit der FOR/NEXT-Schleife zu vergleichen.
BlitzMax: [AUSKLAPPEN] SuperStrict Übrigens noch ein Fehler drin: Deine FOR/NEXT läuft bis 500. Das bedeutet bei Y=500, dass Du über den Speicherbereich des Bildes hinauschießt. Der Debugger meldet diesen Fehler auch. Hast Du DEBUG BUILD on? Außerdem dürften 10 Runden bereits für einen aussagekräftigen Wert genügen.... Noch'n Tipp: SUPERSTRICT immer setzen und alle Variablen definieren! Und zur Geschwindigkeit: BlitzMax heißt nicht ohne Grund BlitzMax. Assembler-Aufruf: BlitzMax: [AUSKLAPPEN] pix=LockImage(bild) |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
funkheld |
Do, Aug 25, 2016 18:26 Antworten mit Zitat |
|
---|---|---|
Ja danke für eure Hilfe.
Aber wie du schreibst, es heißt nicht umsonst BlitzMax. Ich bin erstaunt , wie optimal ein Basicprogram in eine Exe umgesetzt wird. Danke. Grus |
||
DAK |
Sa, Aug 27, 2016 16:35 Antworten mit Zitat |
|
---|---|---|
So leichte Sachen wie eine For-Schleife und das Setzen eines Pixels lassen sich von einem Compiler sehr leicht optimal (=mit der gleichen oder fast gleichen Geschwindigkeit wie Assembler) übersetzen. Einzig bei Sachen wie der Garbage Collection wirst du was verlieren.
Ansonsten wirst du bei BMax mit einem Umweg über C/C++ oder Assembler selten viel Geschwindigkeit gewinnen. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
FireballFlame |
So, Aug 28, 2016 5:15 Antworten mit Zitat |
|
---|---|---|
DAK hat Folgendes geschrieben: Ansonsten wirst du bei BMax mit einem Umweg über C/C++ oder Assembler selten viel Geschwindigkeit gewinnen.
Diese Aussage gilt vielleicht für eine Schleife wie diese, ist im Allgemeinen aber definitiv falsch (sry falls Missverständnis, bin mir nicht sicher, was von beidem du meintest). In einem BlitzMax-Programm bestimmte Funktionen z.B. in C umzuschreiben, kann durchaus einen beachtlichen Geschwindigkeitsgewinn bringen. Auf BlitzMax-NG umzusteigen auch, beides zusammen sogar noch mehr. Ich könnte mal ein Beispiel dazu posten, dann aber in einem neuen Thread, das wäre hier etwas off-topic. Als Anfänger sollte man sich darüber aber nicht zu viele Gedanken machen. Einfach programmieren; wenn man dann doch mal Performance-Probleme bekommt, kann man sich immer noch überlegen, was man optimiert. |
||
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit |
DAK |
So, Aug 28, 2016 23:28 Antworten mit Zitat |
|
---|---|---|
Ist bisserl offtopic, vielleicht sollten wir wo anders weiterschreiben. Ja, es gibt Performance-Gewinne, allerdings liegen die meistens in der Größenordnung von ein paar Prozent, vielleicht 20 oder so, solange es um exakt gleichen Code geht, nicht darum, dass es in C/C++ irgendeine top optimierte Bibliothek gibt, die man verwenden kann, die einfach besser geschrieben ist, als der eigene Code.
Im Gegensatz zu BlitzBasic oder Python, wo der Geschwindigkeitsgewinn bei ansonstem gleichen Code signifikant größer wäre. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group