Seite 2 von 2

Re: Zeitkritische Routine optimieren

Verfasst: 27.03.2010 11:22
von DrShrek
Ja geht natürlich schneller:

Code: Alles auswählen

Procedure MPi_ImageInvertBuffer(Image) ;  
  StartDrawing(ImageOutput(Image))
  *Pointer.Byte = DrawingBuffer()
  ;---------------------------------------- Zeitkritische Routine
  max =  *Pointer + ImageWidth(Image) * ImageHeight(Image) << 2
  For *iPointer.Byte = *Pointer To max
       *iPointer\b = 255-*iPointer\b
  Next
  ;-----------------------------------------
  StopDrawing() 
EndProcedure

Re: Zeitkritische Routine optimieren

Verfasst: 27.03.2010 12:33
von mpz
Hi Dr. Shrek,

die Routinen MP_ImageInvertBuffer(Image) und MPi_ImageInvertBuffer(Image) sind bei mir genau gleich schnell, genau 1.562 Sekunden...

Gruß Michael

Re: Zeitkritische Routine optimieren

Verfasst: 27.03.2010 12:39
von Thorium
Du kannst dir z.b. das CopyImage sparen. Das brauchst du nicht mehr. Kannst mit PB direkt auf den Buffer des Images zugreifen.

Ansonsten schreib mal was genau gemacht werden soll, dann bastel ich ne MMX/SSE2 Variante davon. Ich hab schonmal nen Bytefilter für Imagefilterung mit SSE2 umgesetzt und der ackert 11GB/s auf meinem Rechner durch.

Re: Zeitkritische Routine optimieren

Verfasst: 27.03.2010 14:22
von STARGÅTE
Speziell zum Invertieren:

Code: Alles auswählen

Procedure MP_ImageInvertBuffer(Image) ;  
  StartDrawing(ImageOutput(Image))
  *Pointer.Byte = DrawingBuffer()
  ;---------------------------------------- Zeitkritische Routine
  max =  *Pointer + ImageWidth(Image) * ImageHeight(Image) << 2
  For *iPointer.Long = *Pointer To max Step SizeOf(Long)
       *iPointer\l = ~*iPointer\l
  Next
  ;-----------------------------------------
  StopDrawing() 
EndProcedure 
kann man gleich den ganzen Long invertieren anstatt der einzelnen Bytes ... das ist dann noch mal 4 mal schneller ...

Re: Zeitkritische Routine optimieren

Verfasst: 27.03.2010 19:55
von mpz
Hi,

@Stargate du bist jetzt mit der Inversroutine am schnellsten mit 473 ms, gratuliere...

@Thorium Wenn Du die folgende Routine umsetzen könntest:

Color gibt an ob man den R,G,B,A Wert (0-3 gewählt) manipulieren möchte
ColorVal ist der Bytewert der gesetzt werden soll-> Hier kann man z.B. den Alphawert direkt reinbschreiben und das Image wird mehr oder weniger sichtbar
CheckVal ist der gefundene Bytewert der nicht verändert werden soll

Hier sieht wie mit dieser Routine der Alphawert geändert wird und danach die drei Farben
http://em.q-soft.ch/files/get/PA1MslNELz/alphatest.exe

Code: Alles auswählen

Procedure MP_ImageSetColor (Image, Color, ColorVal, CheckVal) ;  Verändert destruktiv eine ARGB Farbe um einen FestenWert, mit Ausnamecheck 
 
 StartDrawing(ImageOutput(Image))
 *Pointer.Byte = DrawingBuffer()
 max =  *Pointer + ImageWidth(Image) * ImageHeight(Image) << 2

 *Pointer + color
 While *Pointer < max

     If *Pointer\b <> CheckVal
        *Pointer\b = ColorVal 
     EndIf
     
     *Pointer + 4 
           
 Wend 
 StopDrawing()
 
EndProcedure
 
;- Nur eine Beispielanwendung wie die Farben manipuliert werden können
   
    a + 1
    If a > 255 ; Setzt die Farbwerte 1-255 (nur 0 nicht...)
       a = 1
       b+1
    EndIf   
    If b > 3 ; Schaltet die RGBA Wert durch
       b = 0
    EndIf   
    
    MP_TextureSetColor (Texture, b, a, 0 ) 
; --