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:
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