Zeitkritische Routine optimieren

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Zeitkritische Routine optimieren

Beitrag 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
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Re: Zeitkritische Routine optimieren

Beitrag 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
Working on :lol: - LibSGD - MP3D Engine - 8)
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Zeitkritische Routine optimieren

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Zeitkritische Routine optimieren

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mpz
Beiträge: 505
Registriert: 14.06.2005 15:53
Computerausstattung: Win 11 Pro, 48 GB Ram, Intel I7 CPU und RX4070 Grafikkarte, PB (4/5) 6.12LT
Wohnort: Berlin, Tempelhof

Re: Zeitkritische Routine optimieren

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


Working on :lol: - LibSGD - MP3D Engine - 8)
Antworten