Transparenz in einem Kreis
Übersicht

VirusBetreff: Transparenz in einem Kreis |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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
Aber der ist meeega-lahm. Bei High-End-Pcs: 0.7 fps...
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 was mache ich da falsch? dankeschonmal |
||
www.legacy.de |
![]() |
Willi die Rübe |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group