Problem mit Nachbau einer Twirl funktion aus PB

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: Problem mit Nachbau einer Twirl funktion aus PB

BeitragMo, Nov 17, 2008 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Ich habe mal versucht ein Purebasic beispiel für BB umzusetzen(Twirl.pb für diejenigen die das Codearchiv haben). Leider ist es extrem Rechenlastig(so ~100ms). Kann man den Code irgendwie verbessern so dass dieser schneller läuft?

Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Function Twirl(X, Y, R, A#, B=0)
   If B=0 B = BackBuffer()
   IMG = CreateImage(R*2+2,R*2+2) : IB = ImageBuffer(IMG) : CopyRect X-R-1,Y-R-1,R*2+2,R*2+2,0,0,B,IB
   Red = ColorRed() : Gre = ColorGreen() : Blu = ColorBlue() : RGB = Red * $10000 + Gre * $100 + Blu
   LockBuffer B : LockBuffer IB
   For R1 = 1 To R
      VA# = 25.0/R1 : D# = 0
      While D# < 360
         D# = D# + VA# : De# = D# + A#*VA#
         C1# = X+Cos(D#) *R1 : S1# = Y+Sin(D#) *R1 : C2# = R+Cos(De#)*R1 : S2# = R+Sin(De#)*R1
         RGB2 = ReadPixelFast(C1#, S1#, B)
         WritePixelFast(C2#, S2#, RGB2, IB)
      Wend
      LD = LD + 1
   Next
   UnlockBuffer B : UnlockBuffer IB
   DrawBlock IMG,X-R-1,Y-R-1 : FreeImage IMG
End Function

img2 = CreateImage(400,400)
SetBuffer ImageBuffer(img2)
For A = 0 To 200
   Color A,A,A
   Rect A,A,400-A*2,400-A*2,0
Next
SetBuffer BackBuffer()
A = -100
While Not KeyHit(1)
   Cls
   DrawImage img2,200,100
   
   msec = MilliSecs()
   Twirl(MouseX(),MouseY(),100,A)
   msec = MilliSecs() - msec
   Text 0,0, msec
   If MouseDown(1) A = A + 10
   If MouseDown(2) A = A - 10
   
   Flip
Wend


MfG

(Falls ihr an den oberen Rand des buffers geht bekommt man immer die Windows Oberfläche Smile. gut für diejenigen die kein bplus haben(DesktopBuffer()))
Warbseite
  • Zuletzt bearbeitet von Xaymar am Di, Nov 18, 2008 14:48, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Nov 17, 2008 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute mal den Grund für die Langsamkeit ist, dass für jeden Pixel sein eigener Sin und Cos berechnet wird. Außerdem wird nicht jeder Pixel tatsächlich nur einmal berechnet. Durch überschneidungen kommt es auch mal vor, dass ein Pixel dann doppelt berechnet wird.

Aus diesem Grund schlage ich eine andere Berechnungsmethode vor. Sehe dir dazu mal mein folgenden Code an. In diesem werden nicht einzelne Pixel sondern ganze Zeilen und deren Breite berechnet. So lässt sich das ganze um den Faktor einer Quadratwurzel an rechenzeit verkürzen, und es werden nur noch die tatsächliche Pixelanzahl berechnet. Durch Spiegelung kann man dann noch einmal das ganze um die hälfte an Rechenzeit reduzieren. Übrig bleibt dann eine doppelt verschachtelte Schleife und die reinen aber schnellen Pixelbefehle von Blitz.

Code: [AUSKLAPPEN]
Graphics 800,600,0,2
SetBuffer FrontBuffer()

radius#=200
xp=250
yp=250

For x#=0 To radius Step 1
   wt%=Sin(ACos(x/radius))*radius
   Rect xp+x,yp-wt,1,wt*2,1
   Rect xp-x,yp-wt,1,wt*2,1
Next

WaitKey
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Xaymar

ehemals "Cgamer"

BeitragMo, Nov 17, 2008 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
so hatte ich es auch versucht(achtung der titel des themas täuscht etwas, mir fiel nichts ein wie ich das problem beschreiben soll). allerdings guck dir mal an was mein programm macht:
es "verstrudelt" einen radius und die mitte. sowas kann man bestimmt schneller machen. bei dem PB beispiel sinds ja nur ~10ms und es hat sogar noch antialias drin. mal gucken wieso das bei mir so langsam ist.

Mfg

[Edit]
Bei dem beispiel von pb wird direkt auf den grafikbuffer zugegriffen(mit writebyte & co)
Warbseite

The_Nici

BeitragMo, Nov 17, 2008 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde den Bresenham-Algorhitmus nehmen, den findest du auf Wikipedia.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group