Grafik in der Schleife px/py optimieren.

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

funkheld

Betreff: Grafik in der Schleife px/py optimieren.

BeitragDo, Aug 25, 2016 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 25, 2016 12:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Aug 25, 2016 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Graphics 600,600

Global bild:TImage=CreateImage(500,500)
Global Pix:TPixmap=LockImage(bild)
Global startm:Int,endm:Int
Local f%=$ffffff00

Cls
pix=LockImage(bild)
startm= MilliSecs()
For Local z%=1 To 10
For Local py%=0 To 499
For Local px%=0 To 499
WritePixel(pix,px,py,f)
Next
Next
Next
endm= MilliSecs()
UnlockImage(bild)
SetColor 255,255,255
DrawImage bild,10,10
DrawText (endm-startm)/10 + "msec pro Durchlauf" ,10,540
Flip 0
WaitKey


Ü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)
startm= MilliSecs()
For Local z%=0 To 9
pixel(adresse,z,f)
Next
endm= MilliSecs()
UnlockImage(bild)

DrawText endm-startm ,10,540
Flip
WaitKey
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

funkheld

BeitragDo, Aug 25, 2016 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Aug 27, 2016 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 28, 2016 5:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Aug 28, 2016 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group