AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Canvas und CPU Auslastung
Thema durchsuchen
Ansicht
Themen-Optionen

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.404 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
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.113 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.404 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
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

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
hathor
(Gast)

n/a Beiträge
 
#9

AW: Canvas und CPU Auslastung

  Alt 27. Jul 2014, 09:53
In älteren WINDOWS-Versionen - VOR VISTA - gab es den Desktop-Window-Manager noch nicht.

Zitat:
"Fewer repaint messages. When a window is obstructed by another window, the obstructed window does not need to repaint itself."

Repaint-Befehle laufen also ab VISTA in's Leere.

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Canvas und CPU Auslastung

  Alt 27. Jul 2014, 10:25
Das heißt aber nur, daß Windows weniger Repaint-Nachrichten an das Programm sendet, da es ja noch das Bild im Cache hat.

Aber manuelle Nachrichten sollte diese Aussage nicht betreffen.
Das merke ich vorallem beim Firefox mit aktiver Hardwarebeschleunigung, welcher schnell mal den RDP fast lahmlegen kann, nur weil z.B. irgendwo ein winziges GIF abläuft.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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