Transparenz in einem Kreis

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Virus

Betreff: Transparenz in einem Kreis

BeitragSo, Mai 21, 2006 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe vor in meinem Spiel ein Schutzschild zu machen, dass alles um den
Spieler herum aufhellt. Mein bisheriger Code:Code: [AUSKLAPPEN]
Graphics 1024,768,32,1
SetBuffer BackBuffer()

Global XTEC_Disrupter_RGB
Global XTEC_Disrupter_R
Global XTEC_Disrupter_G
Global XTEC_Disrupter_B

Bild = LoadImage("data/test.png")
Repeat
DrawImage Bild,0,0
Circle(MouseX() + 100,MouseY() + 100,100)
Flip
Until KeyDown(1)

End

Function Circle(px, py, rad)
offx = px - rad / 2
offy = py - rad / 2

For x = 0 To rad
   For y = 0 To rad
      If Sqr((rad - x * 2) ^ 2 + (rad - y * 2) ^ 2) < rad Then
         LockBuffer FrontBuffer()
         XTEC_Disrupter_RGB = ReadPixel(x + offx, y + offy)
      XTEC_Disrupter_A=(XTEC_Disrupter_RGB And $FF000000)/$1000000
      XTEC_Disrupter_R=(XTEC_Disrupter_RGB And $FF0000)/$10000
      XTEC_Disrupter_G=(XTEC_Disrupter_RGB And $FF00)/$100
      XTEC_Disrupter_B=XTEC_Disrupter_RGB And $FF
      
      If XTEC_Disrupter_A < 156 Then XTEC_Disrupter_A = XTEC_Disrupter_A + 100 Else XTEC_Disrupter_A = 255
      If XTEC_Disrupter_R < 156 Then XTEC_Disrupter_R = XTEC_Disrupter_R + 100 Else XTEC_Disrupter_R = 255
      If XTEC_Disrupter_G < 156 Then XTEC_Disrupter_G = XTEC_Disrupter_G + 100 Else XTEC_Disrupter_G = 255
      If XTEC_Disrupter_B < 156 Then XTEC_Disrupter_B = XTEC_Disrupter_B + 100 Else XTEC_Disrupter_B = 255

      XTEC_Disrupter_RGB2= XTEC_Disrupter_A*$1000000 +XTEC_Disrupter_R*$10000 + XTEC_Disrupter_G*$100 + XTEC_Disrupter_B
      XTEC_Disrupter_RGB2=XTEC_Disrupter_RGB2 And $FFFFFF
   
      WritePixel x + offx, y + offy,XTEC_Disrupter_RGB2
      UnlockBuffer FrontBuffer()
      EndIf
   Next
Next
End Function

Aber der ist meeega-lahm. Bei High-End-Pcs: 0.7 fps...

was mache ich da falsch?

dankeschonmal
www.legacy.de

Willi die Rübe

BeitragSo, Mai 21, 2006 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach Lock/Unlockbuffer aus der Schleife. Außderdem kannst du für das Umrechnen von Hex in Dezimal auch den Befehl ql:Int benutzen. Umgekehrt ql:Hex


Greetz
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage
 

Virus

BeitragSo, Mai 21, 2006 14:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Lock/Unlockbuffer rausgemacht, geht aber stets genauso lahm.
Es würde vlt mit Readpixelfast und Writepixelfast schneller gehen, aber
da kommt ständig MAV, obwohl ich:
-Nicht aus dem Screenrand rausgemalt habe
-Buffer gelockt habe

Wo genau meinst du soll ich Hex und Int einbauen? denke nicht, dass das
dadurch schneller wird
www.legacy.de

Der Wanderer

BeitragSo, Mai 21, 2006 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Die ganze Routine ist einfach sehr schlecht gecoded, sorry.
Viel zu viel Overhead.

Du musst alles was möglich ist an Berechnungen ausserhalb der Schleifen legen, vor allem der innersten. Du solltest den Kreis auch nicht rechteckig malen, und dann ständig mit Sqr() in der Schleife jeden Pixel testen ob er im Kreis liegt, das ist natürlich der Killer. Auch solltest du so viele IFs wie möglich vermeiden, den Bedingte Sprünge killen die Pipeline der CPU.

Die Pixel einzeln auf die Grafikkarte zu schieben ist auch nicht gerade optimal, da es bei jedem mal durch den Clip-Layer muss, also getestet werden ob der Bereich nicht überdeckt ist von einem anderen Fenster etc.

Evtl. gibt es sowas wie Read/WritePixelArray, wo man gleich mehrere Pixel lesen/schreiben kann. Dann würde ich mir eine Zeile in den Speicher holen, bearbeiten und auf einen Rutsch zurückschreiben.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group