Seite 1 von 4

100% Cpu- Auslastung

Verfasst: 04.09.2009 18:39
von Olaf de Viesel
Hallo Leute!

Wie kann man den Code so umschreiben, das die CPU nicht 100% ausgelastet ist und das nur bei der "WindowEvent()"- Abfrage?

Code: Alles auswählen

Repeat 

    EventID = WindowEvent() 
 
Until EventID = #PB_Event_CloseWindow  Or EventID = #PB_Event_Gadget
Also eine ständige Abfrage anstelle der Schleife??

Vielen Dank im Vorraus

Verfasst: 04.09.2009 18:42
von Thalius
gugg mal in die Hilfe unter:

Code: Alles auswählen

Ereignis = WaitWindowEvent([Timeout])
Cheers,
Thalius

Verfasst: 05.09.2009 12:28
von Deluxe0321
Auch möglich:

Code: Alles auswählen

Repeat
    EventID = WindowEvent()
    If EventID = 0
       Delay(1)
    Endif
Until EventID = #PB_Event_CloseWindow  Or EventID = #PB_Event_Gadget 

Verfasst: 05.09.2009 14:39
von Olaf de Viesel
ahh ich danke euch ^^

Verfasst: 05.09.2009 15:00
von mk-soft
Ein Delay(...) darf nie in einer (Wait)WindowEvent schleife verwendet werden!!!

Verfasst: 05.09.2009 15:36
von Sven
Und warum nicht?

Du musst es nur so machen wie Deluxe: Delay nur ausführen, wenn Event-Stapel leer. Sonst blockt es die Schleife.

Verfasst: 05.09.2009 15:45
von ts-soft
Delay klaut nur events und hat in einem Eventloop nichts zu suchen.

Nimm WaitWindowEvent und die CPU macht sowieso 99% Pause im
EventLoop, aber ohne Eventschluckende und bedienungshemmende Delays.

Delay ist nur selten nützlich, in einem EventLoop hat es garnichts zu suchen.

Verfasst: 05.09.2009 15:47
von Kaeru Gaman
das Delay blockt trotzdem, wenn im nächsten Durchlauf ein Event anliegt.
da es mittlerweile ein Timeout fürs WatWindowEvent gibt, sollte man auf Delay in Eventschleifen komplett verzichten.

btw, ein Delay(1) wartet eine komplette TimeSlice, also 13 - 16 ms.

Verfasst: 05.09.2009 16:38
von Sven
Und wie bekomme ich dann folgendes Konstrukt (gekürzt) aus der Hilfe hin, ohne dass die CPU 100% frisst? Weil WaitWindowEvent() mit Zeitangabe macht Probleme, wenn nebenbei noch ein Timer läuft.

Code: Alles auswählen

Repeat
  Repeat
    ; Always process all the events to flush the queue at every frame
    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_CloseWindow
        Quit = 1
    
      Case #PB_Event_Gadget
        
        ; Do the normal application management here    
    EndSelect
    
  Until Event = 0 ; Quit the event loop only when no more events are available
 
  ; Clear the screen and draw our sprites
  ClearScreen(RGB(0,0,0))
  ClipSprite(0, 0, 0, x, x/8)
  DisplaySprite(0, x, 100)
  DisplaySprite(0, x, x)
  DisplaySprite(0, 300-x, x)
  DisplaySprite(0, playerX, playerY)
    
  FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back

  ;<< hier würd ich mit einem Delay(1) die CPU-Last verringern

Until  Quit Or KeyboardPushed(#PB_Key_Escape)

Verfasst: 05.09.2009 16:52
von Kaeru Gaman
das ist was ganz anderes...
mit WindowedScreen muss man anders arbeiten als mit nem reinen EventLoop.

schau dir als Anregung mal mein super-billiges GameTiming an.
http://www.purebasic.fr/german/viewtopic.php?t=17400