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 )
; --