Ich bin grad Krank und hab sicherlich vor nächster Woche keinen klaren Kopf, also irgendwann nächster Woche poste ich die optimierte Version.
Allerdings ist der Code garnicht so langsam. Du musst für Performancemessungen den Debugger deaktivieren. Dann läuft dein Code bei mir in 170ms durch.
Zwei Sprites vergleichen
Re: Zwei Sprites vergleichen
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

-
swissgregi
- Beiträge: 16
- Registriert: 31.01.2011 12:23
Re: Zwei Sprites vergleichen
So, ich habe wieder ein wenig Zeit gefunden, um ein meinem Projekt zu arbeiten.
Weshalb erhalte ich hier zwei so unterschiedliche Bilder?
Rechnen tu ich ja beide male geteilt durch 2.
Weshalb erhalte ich hier zwei so unterschiedliche Bilder?
Rechnen tu ich ja beide male geteilt durch 2.
Code: Alles auswählen
Structure pPixel
pix.b[0]
EndStructure
For x = 0 To ImageWidth(1)-2 Step 1
For y = 0 To ImageHeight(1)-2 Step 1
Pixelk = x*3+y*I1Pitch
*I2Buffer\pix[Pixelk] = *I1Buffer\pix[Pixelk]/2
*I2Buffer\pix[Pixelk+1] = *I1Buffer\pix[Pixelk+1]/2
*I2Buffer\pix[Pixelk+2] = *I1Buffer\pix[Pixelk+2]/2
*I3Buffer\pix[Pixelk] = Red(PeekL(*I1Buffer+x*3+y*I1Pitch))/2
*I3Buffer\pix[Pixelk+1] = Green(PeekL(*I1Buffer+x*3+y*I1Pitch))/2
*I3Buffer\pix[Pixelk+2] = Blue(PeekL(*I1Buffer+x*3+y*I1Pitch))/2
Next y
Next xRe: Zwei Sprites vergleichen
In deiner Structure ist der Pixel vom Typ 'Byte'. 'Byte' kann aber nur Zahlen von -128 bis 127 speichern. Farben gehen von 0 bis 255. Nimm den Typ 'Ascii'.
Ach und ich weiß nicht obs gewollt ist, aber du 'verlierst' die letzte spalte und die letzte zeile. die grenzen müssten bis Width-1 bzw. Height-1 gehen.
lg kevin
Ach und ich weiß nicht obs gewollt ist, aber du 'verlierst' die letzte spalte und die letzte zeile. die grenzen müssten bis Width-1 bzw. Height-1 gehen.
lg kevin

http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Re: Zwei Sprites vergleichen
Da es dir ja um optimierung geht, solltest du unbedingt ImageWidth() und ImageHeight() aus dem Schleifen-Kopf nehmen.
Das sind unnötigen Funktionsaufrufe die n menge Zeit kosten, da sie mit JEDEM Schleifendurchgang aufgerufen werden.
Eben so sollte die Farbe nur ein mal gelesen werden und dann für die Farbbestimmung die Variable genutzt werden.
das ganze kann man noch weiter treiben indem man die Red(), Green() und Blue() durch Bit-Shift ersetzt und die /2 ebenfalls durch ein Bitshift
Edit: Hier ein Beispiel, das es wirklich funktioniert^^:
Gibt mir die Hälfte aller Farbwerte zurück 
EDIT: etwas zu viel vereinfacht ^^ nun gehts
Das sind unnötigen Funktionsaufrufe die n menge Zeit kosten, da sie mit JEDEM Schleifendurchgang aufgerufen werden.
Eben so sollte die Farbe nur ein mal gelesen werden und dann für die Farbbestimmung die Variable genutzt werden.
Code: Alles auswählen
Structure pPixel
pix.b[0]
EndStructure
SizeX = ImageWidth(1)-1
SizeY = ImageHeight(1)-1
For x = 0 To SizeX
For y = 0 To SizeY
Pixelk = x*3+y*I1Pitch
*I2Buffer\pix[Pixelk] = *I1Buffer\pix[Pixelk]/2
*I2Buffer\pix[Pixelk+1] = *I1Buffer\pix[Pixelk+1]/2
*I2Buffer\pix[Pixelk+2] = *I1Buffer\pix[Pixelk+2]/2
Color = PeekL(*I1Buffer+x*3+y*I1Pitch)
*I3Buffer\pix[Pixelk] = Red(Color)/2
*I3Buffer\pix[Pixelk+1] = Green(Color)/2
*I3Buffer\pix[Pixelk+2] = Blue(Color)/2
Next y
Next x
Code: Alles auswählen
*I3Buffer\pix[Pixelk] = (Color&$FF)>>1
*I3Buffer\pix[Pixelk+1] = (Color>>8&$FF)>>1
*I3Buffer\pix[Pixelk+2] = (Color>>16&$FF)>>1
Code: Alles auswählen
Color = RGB(60,90,240)
Debug (Color&$FF)>>1
Debug (Color>>8&$FF)>>1
Debug (Color>>16&$FF)>>1
EDIT: etwas zu viel vereinfacht ^^ nun gehts
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr