Zwei Sprites vergleichen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Zwei Sprites vergleichen

Beitrag von Thorium »

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

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
swissgregi
Beiträge: 16
Registriert: 31.01.2011 12:23

Re: Zwei Sprites vergleichen

Beitrag von swissgregi »

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.

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 x
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Zwei Sprites vergleichen

Beitrag von CSHW89 »

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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Zwei Sprites vergleichen

Beitrag von STARGÅTE »

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.

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

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
Edit: Hier ein Beispiel, das es wirklich funktioniert^^:

Code: Alles auswählen

Color = RGB(60,90,240)
Debug (Color&$FF)>>1
Debug (Color>>8&$FF)>>1
Debug (Color>>16&$FF)>>1
Gibt mir die Hälfte aller Farbwerte zurück ;-)

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
Antworten