Event aussetzen?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Event aussetzen?

Beitrag von super_castle »

Hmmm..., danke.

Kannst du das mal erklären mit deinem Befehlen?

Gruss
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Re: Event aussetzen?

Beitrag von Jilocasin »

Klar, wieso nicht.

Das alles basiert auf einem "high-resolution performance counter", der vom Betriebssystem bzw. der verwendeten Hardware zur Verfügung gestellt wird. Im Grunde funktioniert es in derselben Art, wie deine Lösung mit dem ElapsedMilliseconds().

QueryPerformanceCounter_() wäre hierbei das Equivalent zu ElapsedMilliseconds(). Da aber unter verschiedenen Systemen die einzelnen "Ticks" des Timers unterschiedlich lang sind, gibt es QueryPerformanceFrequency_(), womit du die Anzahl der "Ticks" pro Sekunde erfährst. Deshalb teile ich die Differenz der beiden Zeiten durch die Frequenz und komme somit auf den echten Zeitunterschied.

Alles andere ist im Grunde geblieben, wie du es programmiert hast, bis auf die Goto's, welche nun mittels Break die "große" While-Schleife verlassen (statt deinem Goto ende).
Dein Goto gehe wurde außerdem in ein zweites While verpackt. :)
Bild
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Event aussetzen?

Beitrag von super_castle »

Ups...hier kommt : Division durch null verboten
Debug "Geschätzt " + StrD(1 / (pixelz * pixelz) * TotalTime, 4) + " pro Sekunde"

Wenn ich hier mit spiele, ändert sich der Zeitablauf nicht:
pixelz = 1.0 / 32000.0
Es rast immer durch , auch wenn ich pixelz verändere.

Code: Alles auswählen

Global *DC.l,*datspeicher.l,datlaenge.l,xs.l,ys.l,xd.l,yd.l,lauf.l,geladen.l
Global text1.s,text2.s,farbe.c

Define.q frequenz, zeita, zeite
Define.f pixelz, TotalTime
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
  
Declare erstelle_bild()
Declare lade_datei()

Enumeration
  #Window_0
  #Button_0
  #Button_1
  #String_0
  #Editor_0
EndEnumeration

Macro HiWord(long)
  (long >> 16) & $FFFF
EndMacro

Macro LoWord(long)
  long & $FFFF
EndMacro

Procedure lade_datei()
  geladen=0
  If ReadFile(0, text1+".wav")
    datlaenge    = Lof(0)
    *datspeicher = AllocateMemory(datlaenge)   
    ReadData(0, *datspeicher, datlaenge) 
  Else
    ProcedureReturn 0
  EndIf
  CloseFile(0)
  geladen=1
EndProcedure

Procedure erstelle_bild()
  anfang:
  While xs => 0
    If QueryPerformanceFrequency_(@frequenz)
      While ys => 0
        QueryPerformanceCounter_(@zeita)
   
        lauf = lauf + 1
        If lauf => datlaenge
          Break
        EndIf
        ys = ys - 1
        farbe = PeekB(*datspeicher + lauf)
        SetPixel_(*DC, xd + xs, yd + ys, RGB(farbe, farbe, farbe))
   
        QueryPerformanceCounter_(@zeite)
        TotalTime = (zeite - zeita) / frequenz
   
        While TotalTime < pixelz
          QueryPerformanceCounter_(@zeite)
          TotalTime = (zeite - zeita) / frequenz
        Wend
   
        Debug "Geschätzt " + StrD(1 / (pixelz * pixelz) * TotalTime, 4) + " pro Sekunde"
      Wend
    Else
      Debug "Ups.. leider keinen high-resolution performance counter gefunden"
    EndIf
    ys=80
    xs=xs-1
  Wend
  ys=80
  xs=31
  Goto anfang
  ende:
  lauf=55
EndProcedure

OpenWindow(#Window_0, 400, 150, 800,500, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)

ButtonGadget(#Button_0, 10,10, 80, 25, "Datei laden")
ButtonGadget(#Button_1, 10,40, 80, 25, "Bild erstellen")
StringGadget(#String_0, 10, 100, 100, 20, "")
EditorGadget(#Editor_0, 10, 150, 200,300)

lauf=55
xs=31
ys=80
xd=250
yd=50
pixelz = 1.0 / 32000.0

Repeat
  
  Event = WaitWindowEvent()
  *DC = GetDC_(WindowID(#Window_0))     
  
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      
      If EventGadget = #Button_0  
        text1=GetGadgetText(#String_0) 
        lade_datei()
        If geladen=1
          text2+"...geladen :"+" "+Str(datlaenge)+" Byte"+Chr(10)
          SetGadgetText(#Editor_0, text2)
        Else
          text2+"...fehler"+Chr(10)
          SetGadgetText(#Editor_0, text2)
        EndIf  
      EndIf
      
      If EventGadget = #Button_1 
        If geladen=1
          erstelle_bild() 
        EndIf  
      EndIf

    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
  
  ReleaseDC_(WindowID(0), *DC) 
   
ForEver


Gruss
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Event aussetzen?

Beitrag von bobobo »

GLOBAL statt DEFINE könnte helfen
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Event aussetzen?

Beitrag von super_castle »

QueryPerformanceFrequency_(), womit du die Anzahl der "Ticks" pro Sekunde erfährst.
Reicht es wenn man das einmal aufruft am Programmanfang, oder muss es bei jeder Messung neu aufgerufen werden?

Gruss
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Event aussetzen?

Beitrag von c4s »

super_castle hat geschrieben:Reicht es wenn man das einmal aufruft am Programmanfang, oder muss es bei jeder Messung neu aufgerufen werden?
Ja.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Event aussetzen?

Beitrag von bobobo »

‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Event aussetzen?

Beitrag von super_castle »

Jup, danke für den Hinweis.
Antworten