Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Canvas und CPU Auslastung (https://www.delphipraxis.net/181220-canvas-und-cpu-auslastung.html)

Blamaster 25. Jul 2014 20:57

Canvas und CPU Auslastung
 
Hi,

mir ist gerade etwas komisches aufgefallen. In meinem Programm zeichne ich in regelmäßigen Abständen (ca. alle 25ms) den Inhalt einer TPaintBox neu.
Wenn ich den Computer gerade frisch hochgefahren habe läuft das Programm mit einer CPU Auslastung < 1% ich kann es Stunden so laufen lassen und die Auslastung bleibt identisch.

Fange ich jetzt an mit dem Computer und vornehmlich Programmen wie VLC, FlashPlayer usw. zu arbeiten, dann steigt die CPU Auslastung meines Programms aufeinmal schlagartig auf >25% an. Ein Neustart meiner Software bringt dann auch keine Besserung und sie steigt direkt wieder mit >25% Last ein.

Wie kann das sein ? Irgendjemand eine Idee wo man ansetzen könnte ?

sx2008 25. Jul 2014 23:11

AW: Canvas und CPU Auslastung
 
Zitat:

Zitat von Blamaster (Beitrag 1266679)
In meinem Programm zeichne ich in regelmäßigen Abständen (ca. alle 25ms) den Inhalt einer TPaintBox neu.

Wahrscheinlich benützt du die Paintbox falsch.
Wichtigste Regel:
Grundsätzlich nur aus dem Event
Delphi-Quellcode:
OnPaint
auf die Paintbox zeichen!
Niemals von anderer Stelle aus auf die Paintbox zeichen.

Wenn sich der Inhalt der Paintbox ändern soll, dann rufst du
Delphi-Quellcode:
Paintbox1.Refresh
auf.
Du solltest
Delphi-Quellcode:
Refresh
aber nicht blind mit einem Timer aufrufen sondern nur dann wenn sich irgendwas geändert hat.
Sollte die Paintbox durch ein Fenster verdeckt und dann wieder aufgedeckt worden sein, dann ruft Windows automatisch
Delphi-Quellcode:
Refresh
auf was wiederum das
Delphi-Quellcode:
OnPaint
-Event auslöst.

Deine Vollauslastung eines CPU-Kerns kann natürlich auch andere Ursachen haben...

Blamaster 25. Jul 2014 23:31

AW: Canvas und CPU Auslastung
 
Das zeichnen im OnPaint ist mir bekannt :)
Einfach blind wird das Refresh auch nicht aufgerufen. Die Visualisierung ändert sich mit jedem Timeraufruf daher muss dann auch alle 25ms neu gezeichnet werden.

Ich hatte allerdings vergessen zu sagen das ich die Graphics32 Paintbox benutze. Die hat einen eigenen Backgroundbuffer in den ich aktuell zeichne. Sollte im Endeffekt aber auch nichts anderes machen als die Bitmap die im OnPaint auf die PaintBox gezeichnet wird.

Die Graphics32 Paintbox habe ich allerdings auch erst heute eingesetzt mit der Hoffnung das Problem dadurch lösen zu können. Vorher hatte ich die normale TPaintBox mit dem zeichnen im OnPaint in Kombination mit dem Refresh, allerdings bestand das Problem auch dort.

Die Probleme scheinen gefühlt eher von außen zu kommen. Ich habe das Programm jetzt einige Stunden am Stück laufen lassen und permanent die CPU Auslastung überwacht. Die lag permanent in einem Bereich von 0-3%.

Erst wenn ich so wie jetzt gerade den Firefox offen habe um zu posten geht die CPU Auslastung von meinem Programm auf fast 25%. Da muss ja in irgendeiner Form ein Zusammenhang bestehen. Gleiche Wechselwirkung besteht allerdings interessanter Weise auch zum Firefox. Auch dort ist die CPU Auslastung merkbar höher wenn mein Programm läuft.

Weiß jemand wie das Zeichnen der Canvas von Windows verwaltet wird ? Ich habe das Gefühl das beispielweise Firefox ziemlich viel zeichnen möchte, mein Programm gleichzeitig auch einen ganzen Haufen Aufträge zum neuzeichnen versendet und es dadurch in irgendeiner Queue/Fifo zu einem anstauen der Aufträge kommt kann das sein ?

jaenicke 25. Jul 2014 23:46

AW: Canvas und CPU Auslastung
 
Die genannten Programme haben alle eins gemeinsam:
Sie nutzen Hardwarebeschleunigung.
Insbesondere bei XP hat das dann stark gebremst, da XP an sich noch nicht die Grafikkarte zur Darstellung genutzt hat. Durch diese Mischung entstand noch einmal extra CPU-Last, die schon durch die GUI an sich höher war als seit Vista.

Seit Vista ist das jedenfalls eigentlich nicht mehr so. Bei Vista war die Umsetzung des Fenstermanagers allerdings ungünstig, so dass dieser beim Zeichnen ein Flaschenhals war. Bei Windows 7 und 8 hatte ich solche Effekte aber gar nicht mehr.

hathor 26. Jul 2014 07:04

AW: Canvas und CPU Auslastung
 
Ich habe da ein Verständnisproblem:

Wenn ein Programm NICHT den Fokus hat oder teilweise oder ganz verdeckt ist oder minimiert ist, warum soll WINDOWS dann das Fenster neu zeichnen?

Das heisst: GPU- bzw. CPU-Auslastung sind dann gering.

Was soll also dann der Vergleich?

Uwe Raabe 26. Jul 2014 08:23

AW: Canvas und CPU Auslastung
 
Miss doch mal die Zeitabstände zwischen den OnPaint-Ereignissen und die Dauer derselben.

jaenicke 26. Jul 2014 22:01

AW: Canvas und CPU Auslastung
 
Zitat:

Zitat von hathor (Beitrag 1266692)
Wenn ein Programm NICHT den Fokus hat oder teilweise oder ganz verdeckt ist oder minimiert ist, warum soll WINDOWS dann das Fenster neu zeichnen?

Bei XP passiert das öfter als man denkt. Seit Vista speichert Windows den Inhalt zwischen, so dass die Anzahl der Zeichenereignisse deutlich geringer ist.

Das kannst du auch leicht testen. Zähle einfach im OnPaint des Formulars einen Zähler hoch, der sich in die Caption des Formulars schreibt. Und dann bewege z.B. einmal ein anderes Fenster darüber hin und her.
Bei XP bekomme ich so rund 100 OnPaint Ereignisse pro Sekunde (!), bei Windows 8 kein einziges...

Blamaster 26. Jul 2014 23:45

AW: Canvas und CPU Auslastung
 
Das Problem tritt aktuell unter Windows 7 auf. Was mir gerade noch aufgefallen ist die dwm.exe erzeugt wenn die Auslastung von meinem Programm hoch ist ebenfalls eine Auslastung von 10%.

Man merkt dann auch das die komplette Windows Oberfläche nur noch extrem träge reagiert.

Daher auch die Frage was passiert wenn ein Programm/Fenester verdeckt ist im Timer aber auch bei nicht sichtbarem Fenster ständig die Repaints ausgelöst werden. Die werden denke ich ja trotzdem erstmal in einer Windows internen Tasklist landen. Können die sich dort irgendwie anstauen ?

Desweiteren ist mir auch noch nicht so ganz klar wie die dwm.exe da Auswirkungen drauf hat. Wenn ich es richtig gelesen habe ist die ja eigentlich für die Aero Effekte zuständig. Nun ist mir allerdings nicht klar was das Zeichnen auf die Paintbox Canvas mit dem Aero macht.

Zumal die Auslastung der dwm.exe auch noch bei 10% bleibt wenn ich mein Programmfenster minimiert also nicht sichtbar habe.

himitsu 27. Jul 2014 07:22

AW: Canvas und CPU Auslastung
 
Zitat:

Zitat von Blamaster (Beitrag 1266725)
Nun ist mir allerdings nicht klar was das Zeichnen auf die Paintbox Canvas mit dem Aero macht.

Alles?

Desktop-Window-Manager

Das ist das Ding, an welche nun erstmal alle Zeichenoperationen gehen, auch wenn das Fenster verdeckt ist.
Der speichert sich alle Bilder zwischen, welches auch für die "Anwendung hängt"-Ghostingfunktionen genutzt wird, genauso wie für die Berechnungen der Transparenzeffete im Aero.

Man kann aber selber drauf reagieren, ob das eigene Programm "sichtbar" ist und stoppt dann eben seinen Timer, oder bremst ihn zumindestens aus.



Täuscht das, oder wurde hier verschwiegen was, wie und eventuell warum eigentlich so oft rumgemalt wird?

Achja, es gibt Programme, die hacken sich in alle anderen Fenster rein und fangen Zeichenfefehle ab (vorallem Programme zur Bildübertragung), welches eventuell bremsend wirken kann.

Uwe Raabe 27. Jul 2014 09:23

AW: Canvas und CPU Auslastung
 
Zitat:

Zitat von Blamaster (Beitrag 1266679)
In meinem Programm zeichne ich in regelmäßigen Abständen (ca. alle 25ms) den Inhalt einer TPaintBox neu.

Wie machst du das genau?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz