AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Canvas und CPU Auslastung

Canvas und CPU Auslastung

Ein Thema von Blamaster · begonnen am 25. Jul 2014 · letzter Beitrag vom 28. Jul 2014
Antwort Antwort
Seite 1 von 2  1 2   
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#1

Canvas und CPU Auslastung

  Alt 25. Jul 2014, 20:57
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Canvas und CPU Auslastung

  Alt 25. Jul 2014, 23:11
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 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 Paintbox1.Refresh auf.
Du solltest 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 Refresh auf was wiederum das OnPaint -Event auslöst.

Deine Vollauslastung eines CPU-Kerns kann natürlich auch andere Ursachen haben...
fork me on Github
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#3

AW: Canvas und CPU Auslastung

  Alt 25. Jul 2014, 23:31
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Canvas und CPU Auslastung

  Alt 25. Jul 2014, 23:46
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

AW: Canvas und CPU Auslastung

  Alt 26. Jul 2014, 07:04
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?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#6

AW: Canvas und CPU Auslastung

  Alt 26. Jul 2014, 08:23
Miss doch mal die Zeitabstände zwischen den OnPaint-Ereignissen und die Dauer derselben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Canvas und CPU Auslastung

  Alt 26. Jul 2014, 22:01
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...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#8

AW: Canvas und CPU Auslastung

  Alt 26. Jul 2014, 23:45
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.111 Beiträge
 
Delphi 12 Athens
 
#9

AW: Canvas und CPU Auslastung

  Alt 27. Jul 2014, 07:22
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Jul 2014 um 07:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.993 Beiträge
 
Delphi 12 Athens
 
#10

AW: Canvas und CPU Auslastung

  Alt 27. Jul 2014, 09:23
In meinem Programm zeichne ich in regelmäßigen Abständen (ca. alle 25ms) den Inhalt einer TPaintBox neu.
Wie machst du das genau?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 Uhr.
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