Graphische Anzeige der verbleibenden Zeit (ablaufende Uhr)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Terror-State

Betreff: Graphische Anzeige der verbleibenden Zeit (ablaufende Uhr)

BeitragSo, Nov 06, 2005 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Lässt sich irgendwie scheisse formulieren... Naja wie dem auch sein.
Ich brauch eine Uhr die anzeigt wieviel Zeit noch übrig sind... hier einfach ma der code BlitzBasic: [AUSKLAPPEN]

Global Runde,Now,Rekord,U
Global l = 50
Global Uhr = CreateImage (100,100)
Global frametimer = CreateTimer (20)
Runde = MilliSecs()
Rekord = 6000
Repeat
WaitTimer (frametimer)
Cls
SetBuffer BackBuffer()
Now = MilliSecs()

If LastLine <= 360 Then

AktW = (Now-Runde) / (Rekord/360.0)
If LastLine <> AktW Then
Color 255,0,0
SetBuffer ImageBuffer (Uhr)
For I = LastLine To AktW
W = I - 90
Line 50,50,50+Cos(W)*l,50+Sin(W)*l
Next
SetBuffer BackBuffer()

LastLine = AktW
U = U + 1
EndIf
EndIf

Color 255,255,255
DrawImage Uhr,20,20
Oval 20,20,100,100,0
Text 0,0, U
Flip
Until KeyHit(1)
End


Dada! Mein Prob is wie immer: viel zu langsam...
Habt ihr ne Idee wie das besser geht!
Ob friedlich oder militant, wichtig ist der Widerstand

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Nov 07, 2005 1:31
Antworten mit Zitat
Benutzer-Profile anzeigen
endweder als Loadanimimage laden
oder
Vorberechnen und mit Writepixel einzeichnen!

Vielleicht code ich morgen mal was !
[BB2D | BB3D | BB+]

PSY

BeitragMo, Nov 07, 2005 3:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

was auch auf jeden Fall extrem ausbremst ist der Oval-Befehl.

Guck Dir mal folgenden Code an:

Code: [AUSKLAPPEN]
Graphics 800,600,16,1
SetBuffer BackBuffer()
countdown=120 ;gesamtzeit countdown in sekunden
segmentsize=(360/countdown)+1 ;winkelzuwachs pro sekunde
Uhr = CreateImage (100,100)
start_time=millisecs()
intervall_time=start_time

Repeat
      Cls
      total_time=(millisecs()-start_time)/1000
 
      If millisecs()-intervall_time >1000
            intervall_time=millisecs()
            segments=segments+1
            SetBuffer ImageBuffer (Uhr)
            For I = 1 To (segments*segmentsize)
                  W = I - 90
                  Line 50,50,50+Cos(w)*50,50+Sin(w)*50
            Next
      EndIf
      
      SetBuffer BackBuffer()
      Color 255,255,255
      DrawBlock Uhr,20,20
      Oval 20,20,100,100,0 ;diesen befehl einkommentieren !!!
      Text 0,0, total_time
      Gosub fps
      Flip 0
Until KeyHit(1)

;misst aktuelle FPS
.fps
frames=frames+1
If  millisecs() > fpstimer + 1001
      current_fps=frames
      frames=0
      fpstimer = MilliSecs()
EndIf
Text 100,200,"FPS : " + current_fps

Return


Und dann kommentier mal den Oval-Befehl aus und versuch's wieder...


L8er,
PSY

Terror-State

BeitragMo, Nov 07, 2005 8:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhh mit Oval 800 Frames und ohne 4000... na gut es ist wesentlich schneller zugegeben!
ABER: Du hast ja eh meinen frametimer rausgenommen Wink von daher zählt das nich! Aber das oval sooo langsam is wusst ich bis jetz noch gar nich! Gut zu wissen!!! ich danke dir erstma!
Ob friedlich oder militant, wichtig ist der Widerstand

Hummelpups

BeitragMo, Nov 07, 2005 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Line ist auch langsam. Plot auch, Text auch.
Gerade bei consolenservern nervt das wenn sie nicht
einmal doppelt so schnell laufen wie das Hauptprogramm :-!

writepixelfast is ne schöne sache.

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

PSY

BeitragMo, Nov 07, 2005 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

Zitat:
ABER: Du hast ja eh meinen frametimer rausgenommen von daher zählt das nich!


Der Wert von mir liefert die Anzahl der Schleifendurchläufe pro Sekunde. Zählt also Wink

Wie Doom schon sagt, sind die ganzen rudimentären Ausgabebefehle lahm ohne Ende.
Vorgezeichnete Grafiken sind immer noch am schnellsten...
Writepixelfast & Co sind schon ne feine Sache, aber bei komplexeren Sachen halt nicht die Universallösung 8)

L8er,
PSY

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Nov 07, 2005 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
So, habs mal neu mit Writepixel geschrieben
Zwar nicht ganz so schnell wie mit dem Line Befehl, dafür aber sauberer

inklusive einigen vorberechnungen.. aber kann noch locker gesteigert werden!


BlitzBasic: [AUSKLAPPEN]
Graphics 800 ,600,16,1
Dim FPS (3)
;Uhr vorberechnen
Global Uhr = CreateImage (100 ,100)
Global Uhrrand : MakeUhrImage (100 ,100)

Global altgrad
Dim UhrMatrix (99,99)
Dim UhrMatrixgrad (99,99)
For x = 0 To 99
For y = 0 To 99
If (X - 50) ^2 + (Y - 50) ^2 < 49*49 Then
UhrMatrix (x,y) = 1
UhrMatrixgrad (x,y) = (ATan2 (y - 50 ,X - 50) + 90 + 360) Mod 360
End If
Next
Next
;Uhr vorberechnet
SetBuffer BackBuffer ()
While Not KeyDown (1) ;###########

f = (f + 1) Mod 360

makeuhr (f)
DrawImage uhr,100,100

Text 9 ,9,\"FPS:\" + FPS (1) : FPS (2) = FPS (2) + 1 : If MilliSecs () > FPS (3) + 999 Then FPS (1) = FPS (2) : FPS (2) = 0 : FPS (3) = MilliSecs ()
Flip 0
Cls
Wend

End ;#################

Function MakeUhrImage (x,y) ; das Oval nur einmal beim Start
Uhrrand = CreateImage (101,101)
SetBuffer ImageBuffer (Uhrrand )
Oval 0,0,100,100,0
End Function

Function makeuhr (GradZeit)
If altgrad > GradZeit Then
FreeImage Uhr
Uhr = CopyImage (UhrRand)
altgrad = 0
EndIf
SetBuffer ImageBuffer (Uhr)
LockBuffer ()
For x = 0 To 99
For y = 0 To 99
If UhrMatrix (x,y) = 1 Then
If UhrMatrixgrad (x,y) <= GradZeit Then
If UhrMatrixgrad (x,y) > altgrad Then
WritePixelFast (x,y, $ff0000)
End If
End If
End If
Next
Next
UnlockBuffer ()
SetBuffer BackBuffer ()
altgrad = GradZeit
End Function
[BB2D | BB3D | BB+]

Terror-State

BeitragMo, Nov 07, 2005 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhh sieht schonmal ganz interessant aus! Danke für die Mühe! Dummerweise wie du schon sagtest viel zu langsam... 100% Speicherauslasung ^^ mein Lieber schollie ^^
ich werd den code also nochmal umschreiben müssen...
Mit einem Frametimer gehtz eigentlich, allerdings stimmt dann die zeit nicht mehr... wert wohl nich drum rum kommen, es über WritepixelFast zu machen. Obwohl ich irgendwo gelesen habe, das Line auf WritePixelFast basiert!
Ob friedlich oder militant, wichtig ist der Widerstand

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Nov 07, 2005 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Langsam ist relativ, denn diese Function benötigt bei mir
ca 0,2 Millisekunden die ja dazu gerechnet werden, zu deiner Spielschleife!
[BB2D | BB3D | BB+]

Terror-State

BeitragMo, Nov 07, 2005 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
so habs erstma umgeschrieben... es sind 2 gr0ße performence gewinne im vergleich zu deinem proggi:

1. ich hab mir gedacht ich pack einfach ne transparente uhrengrafik drüber => es endfällt die langsame if-berechnung am anfang, bei der eh 7200 von 10000 durchkommen

2. die schleifen für den kreis sind dynamisch... also für jeden der vier quadranten => endfallen pro frame 50X50 = 2500 unnötige schleifen durchläufe

BlitzBasic: [AUSKLAPPEN]

Graphics 800 ,600,16,0
Dim FPS (3)
;Uhr vorberechnen
Global Uhr = CreateImage (100 ,100)
Global frametimer = CreateTimer (50)
Global LastLine, AktW
Global Runde, Time, Stopper, Now, TimeDiff,Rekord

Dim UhrMatrix (99,99)
For X = 0 To 99
For Y = 0 To 99
UhrMatrix (X,Y) = (ATan2 (Y - 50 ,X - 50) + 450) Mod 360
Next
Next

;Uhr vorberechnet

Rekord = 6000
Runde = MilliSecs()
;SetBuffer BackBuffer ()
While Not KeyDown (1) ;###########
WaitTimer (frametimer)
SetBuffer BackBuffer()
Now = MilliSecs()
TimeDiff = Now - Runde
Uhr()
DrawImage Uhr,100,100
Text 9 ,9,\"FPS:\" + FPS (1) : FPS (2) = FPS (2) + 1 : If MilliSecs () > FPS (3) + 999 Then FPS (1) = FPS (2) : FPS (2) = 0 : FPS (3) = MilliSecs ()
Flip
Cls
Wend

End ;#################

Function Uhr ()
If LastLine <= 360 Then
AktW = TimeDiff / (Rekord/360.0)
If AktW < 90 Then
X1=49:X2=99:Y1=0:Y2=49
ElseIf AktW <= 180 Then
X1=49:X2=99:Y1=49:Y2=99
ElseIf AktW <= 270 Then
X1=0:X2=49:Y1=49:Y2=99
Else
X1=0:X2=49:Y1=0:Y2=49
EndIf

SetBuffer ImageBuffer (Uhr)
LockBuffer ImageBuffer (Uhr)
For X = X1 To X2
For Y = Y1 To Y2
If UhrMatrix (x,y) <= AktW Then
If UhrMatrix (x,y) >= LastLine Then WritePixelFast (X,Y, $ff0000)
End If
Next
Next
UnlockBuffer ImageBuffer (Uhr)
SetBuffer BackBuffer ()
LastLine = AktW
EndIf
End Function



viel spass mit dem code, mit dem man jetz echt zufrieden sein kann, denn viel schneller gehtz kaum ^^

Edit: Apropo schnell >_< wenn "Rekord" unter 3000 ms ist dann funzt die darstellung nicht -.-
Ob friedlich oder militant, wichtig ist der Widerstand

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMo, Nov 07, 2005 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Schneller kein Problem...
Bei dem Programmen ist es ja so das teilweise rote Pix nochmal übermalt werden(doppelt halt)!

Ich hab mir überlegt das ich in der Vorberechnung die speichere die zusätzlich gemalt werden müssen!
Das umgesetzt sieht dann etwa so aus!
Bei der ersten Version kam ich auf 0,2 Millisecs
Bei dieser auf 0,05 Millisecs also ca. 4x schneller...


BlitzBasic: [AUSKLAPPEN]
Radius = 50 ; Kann geändert werden
Dim RadPixel% (360) , AddPixel% (0 ,0)
Dim FeldA% (0 ,0) , FeldB% (0 ,0) , FeldC% (0 ,0) ; Zum schnellen Vorberechnen
Global Altgrad
Graphics 800 ,600
Dim FPS (3)

;
;;Speedtest der Function
Time1 = MilliSecs ()
CreatePixelsToDIM (Radius)
time1 = MilliSecs () - time1
;
;Uhr vorberechnen
Global Uhrrand : MakeUhrImage (Radius * 2 ,Radius * 2)
Global Uhr = CopyImage (UhrRand)
;
;Speedtest der Function
Time2 = MilliSecs ()
For t = 0 To 10000
Grad = (test + 2) Mod 360
MakeUhr (test)
Next
time2 = MilliSecs () - time2
Print \"Radius: \" +radius
Print \"vorberechnung : \" + time1 + \"ms\"
Print time2 / 10000.0 + \" ms pro Durchlauf\"
Print \"Taste drücken\"
WaitKey
;Speedtest Ende
SetBuffer BackBuffer ()

While Not KeyDown (1) ;##########
Grad = (grad + 1) Mod 360
MakeUhr (Grad)
DrawImage uhr,100,100 ; dat Rote
DrawImage Uhrrand,100,100
Text 9 ,9,\"FPS:\" + FPS (1) : FPS (2) = FPS (2) + 1 : If MilliSecs () > FPS (3) + 999 Then FPS (1) = FPS (2) : FPS (2) = 0 : FPS (3) = MilliSecs ()
Flip 0
Cls
Wend

End ;##########################
Function MakeUhrImage (x,y) ; das Oval nur einmal beim Start
Uhrrand = CreateImage (x + 1 ,y + 1)
SetBuffer ImageBuffer (Uhrrand )
Oval 0 ,0,x + 1 ,y + 1 ,0
End Function

Function MakeUhr (Grad)
If altgrad > Grad Then
FreeImage Uhr
Uhr = CopyImage (UhrRand)
altgrad = 0
EndIf
SetBuffer ImageBuffer ( Uhr)
LockBuffer ()
For i = RadPixel (altgrad) To RadPixel (Grad)
WritePixelFast AddPixel (i,0) ,AddPixel (i,1) , $ff0000
Next
UnlockBuffer ()
SetBuffer BackBuffer ()
altgrad = Grad
End Function

Function CreatePixelsToDIM (Radius) ;Vorberechnung
PixANZ = (radius * radius) * Pi
;ReDim
Dim AddPixel (PixANZ,1) ;0=x,1=Y
Dim FeldA (2 * radius,2 * radius)
Dim FeldB (2 * radius,2 * radius)
Dim FeldC (2 * radius,2 * radius)
;
For x = 0 To radius * 2 - 1
For y = 0 To radius * 2 - 1
If (X - radius) ^2 + (Y - radius) ^2 < radius * radius Then
FeldB (x,y) = 1
FeldC (x,y) = (ATan2 (y - radius,X - radius) + 90 + 360) Mod 360
End If
Next
Next
For Grad = 0 To 360
For x = 0 To radius * 2 - 1
For y = 0 To radius * 2 - 1
If FeldB (x,y) = 1 Then
If FeldA (x,y) = 0 Then
If FeldC (x,y) < Grad Then
FeldA (x,y) = 1
AddPixel (Pos,0) = x;0=x,1=Y
AddPixel (Pos,1) = y;0=x,1=Y
Pos = pos + 1
End If
End If
End If
Next
Next
RadPixel (Grad) = pos
Next
;ReDim
Dim FeldA (0 ,0)
Dim FeldB (0 ,0)
Dim FeldC (0 ,0)
;
End Function

[BB2D | BB3D | BB+]

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group