Custom Window Library - Beispiel ohne CPU-Auslastung

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Hö? O_o
So weit ich weis laufen doch alle Anwendungen mit einem Delay, wenn
diese nichts zu tun haben.
In der Mainloop steht doch meist immer so was:

Code: Alles auswählen

Select WindowEvent()
  Case #PB_Event_Gadget
    ; Code
  ;Case weitere Events
  Default
    Delay(10)
EndSelect
Ist nichts zu tun wird durch das Delay(10) die CPU mitgeteilt, das es
andere Dinge verarbeiten soll und so bleibt die Auslastung bei >= 1%.
Ich kenn bis her überhaupt keine andere Möglichkeit O_o ...

Windows muss ja trotzdem das Fenster weiter aktualisieren bzw zeichnen,
da hier aber nichts Animiert ist muss es nicht dauernt komplet neu
gezeichnet werden, wie Windows das aber intern macht weis ich nicht. Bei
der CWL ist das anders, da hier Animationen jederzeit geschehen können
muss das Fenster immer wieder gezeichnet, aber wenn nichts zu tun ist
reicht meist eine FPS von >= 10, was im Entefekt wieder eine sehr
geringe Auslastung ergibt. Sind Framewecksel von mehr als 10 pro
Sekunde erwünscht, muss die FPS natürlich höher sein, damit diese auch
rukelfrei angezeigt werden können.

Bei Spielen ist das anders, diese Arbeiten so wie die CWL, zeichnen also
das Bild bei jedem Loop neu. Spiele haben aber keine "Delay"-Bremse, da
diese zu 99% so wie so die vollen Systemressorcen brauchen um flüssig
zu laufen und auch das einzige sind, was die CPU beansprucht.

Also Entweder ich hab dich jetzt falsch verstanden, dann öhm ... ja -.- .
noch mal bitte für mich :D ... oder ich hoffe ich hab dir das system
erfolgreich näher bringen können :)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Anwendungen arbeiten grundsätzlich mit WaitWindowEvent und nicht mit
WindowEvent. Hierfür ist es eben erforderlich, das du alles andere in
Callbacks, TimerCallbacks oder Threads verpackst.

Wenn das mit Deiner Lib erzeugte Fenster nicht den Fokus hat, so sollte die
erzeugte CPU-Last bei 0% liegen, weil es ja nichts zu tun hat. Ansonsten
klaut es den anderen Programmen, die die gerade den Fokus haben die
Resourcen und das ist nicht Chic :mrgreen:

WindowEvent ist ja mehr für Einsteiger in PB, weil die eben mit Callbacks
usw. nicht so firm sind. Das ist aber für normalle Anwendungen absolut
ungeeignet!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag von HeX0R »

Trotzdem ist das WindowEvent() falsch!
Du solltest nur verzögern, wenn die ganze Event-Schlange leer ist, also:

Code: Alles auswählen

Select WindowEvent() 
  Case #PB_Event_Gadget 
    ; Code 
  ;Case weitere Events 
  Case 0 
    Delay(1) 
EndSelect
und eine ms Delay langt auch vollkommen.

Auch sehe ich keinen Grund, warum ein WindowEvent() absolut ungeeignet sein soll (wenn richtig angewendet).
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

HeX0R hat geschrieben:T
Auch sehe ich keinen Grund, warum ein WindowEvent() absolut ungeeignet sein soll (wenn richtig angewendet).
Welches Delay ist denn das richtige? 0 oder 1 oder doch 10

Nein, das Zeichnen sollte er ins #WM_PAINT ereignis oder ähnlich packen, im
Callback. Immer wiederkehrende Aktionen mit einem TimerCallback steuern
usw.

Ansonsten ist die CPU Last unnötig hoch, bei zu grossem Delay werden
Ereignisse verschluckt usw. Richtige Anwendung von WindowEvent() ist, es
nicht anzuwenden. Viele Progamme schließe ich nicht, minimiere sie nur, da
erwarte ich, das diese lediglich RAM verbrauchen, aber die CPU unbelastet
bleibt, dies ist nur mit WaitWindowEvent() möglich.

Hab aber jetzt keinen Bock auf irgendwelche Delay-Diskussionen, wer's
nicht anders kann oder will, solls halt machen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag von HeX0R »

Dann bin ich ja mal gespannt auf ein Game von dir in PB im WindowedScreen nur unter Verwendung von WaitWindowEvent() ...

Und ums gleich vorwegzunehmen:
Du sagtest WindowEvent() sei IMMER schlecht! Da stand nix von wegen : Nur in Applikationen (was bei manchen Netzwerkapplikationen und/oder hardwarenahen IO-Applikationen übrigens auch falsch ist).

Aber nun gut, man beachte deine Signatur... :mrgreen:

und über das Delay wollte ich nie diskutieren...
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Ja stimmt Hexor, hast recht ... war ja nur schnell hingeschrieben /:->

@ts-soft
Aber an WaitWindowsEvent() hab ich jetzt garnicht mehr gedacht :? ...
hast vollkommen recht -.- . Aber um das selbe system wie bei
WaitWindowEvent() einsetzten zu können wüsst ich erlich gesagt erst mal
gerne, was dieses "Wait" intern bedeutet. Also was der unterschied
zwischen WindowEvent() und WaitWindowEvent() ist. Fals einer von euch
mir das beantworten kann, wäre das eine sehr große hilfe. Sonnst muss
ich wohl mal versuchen von Fred eine Antwort zu bekommen, und das mit
meinem fast nichtvorhandenen Englischkenntnissen ^_^

Dann kann ich nämlich anfangen mir entsprechende Lösungen für meine
Lib zu überlegen. :D

Wobei das ganze ja in erster Linie für Spiele gedacht ist/war, was das
System erklärt. Das ich es auch für normale Windows-Fenster nutzbar
mache ist mehr oder weniger ein Zufall :lol:. Aber wie auch immer, bis
her werden die EventQueue der Windows-Fenster und die EventQueue der
CWL unabhängig von einander in der Mainloop abgefragt, bei
Fullscreenanwendungen fällt die Windows-EventQueue ja ganz weg. Aber
wenn ich weis wie WaitWindowEvent() unter PB funktioniert kann ich nen
weiteres System speziell für Anwendungen entwickeln. Bis her
unterscheidet die CWL ja nur zwischen Screen und Fenster durch die
unterschiedlichen Grafiktypen (Sprite, bzw Image), mit Threads könnte ich
dank der PB4.0 ja auch ohne reue dann Arbeiten, fals ich es für
angebracht halten werde :D.

Aktuell werden Fenster, die minimiert oder unsichtbar sind nicht neu
gezeichnet, durch ein entsprechendes, z.B. Delay(100) wäre also
gegeben, das hier keine unnötigen Ressorce verbraucht werden. Aber
natürlich nicht das wahre /:-> ...

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@Hexor
Ich meinte nur richtige Applikationen (auch Netzwerkanwendungen)

Den Kompromiss zwischen verlorengehender Ereignisse und CPU last ist nur in (Fullscreen-)Spielen akzeptabel (ich Spiele sowieso fast nie :mrgreen: ), diese verwenden ja sowieso meist keine WindowEvents.

@PMV
WaitWindowsEvent leitet die Ereignisse weiter. Alles was nicht in Deinem MainLoop verwendet wird, wird nicht beachtet und weitergeleitet. Landet also in den entsprechenden Callbacks. Ohne WaitWindowEvent würden diese auch nicht funktionieren.
Ob das jetzt so ganz richtig ist :freak: , aber sinngemäß.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Das was du geschrieben hast, lass ich jetzt mal unkommentiert, weil ichs
ja selber nur vermuten kann ... /:->

Aber wie bewerkstelligt WaitWindowEvent() denn das warten? Da müsste
doch auch so was wie ein Delay() eingebaut sein, oder nicht?
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PMV hat geschrieben: Aber wie bewerkstelligt WaitWindowEvent() denn das warten? Da müsste
doch auch so was wie ein Delay() eingebaut sein, oder nicht?
Wie :freak: aber auf jedenfall ohne Delay oder Sleep.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag von HeX0R »

Hmm... das würde ich jetzt aber gerne genauer wissen
Antworten