AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[XE7, VCL] Wie TChart-Zeichnen beschleunigen?

Ein Thema von nuclearping · begonnen am 1. Jul 2015 · letzter Beitrag vom 1. Jul 2015
Antwort Antwort
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
379 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 07:03
...also auf den ersten Blick fehlen mir da Series.BeginUpdate und Series.EndUpdate. Das beschleunigt das zeichnen schon etwas. Die LineSeries könntest/solltest Du zu FastLineSeries machen.
Außerdem solltest Du das Scrollen (SetBounds) vor dem EndUpdate handeln, sonnst muss er ja alles nochmal zeichnen.
Andreas Schachtner
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 08:23
Die Optimierungen am Chart sind die eine Sache, der Transport der Werte eine völlig andere.

Man bekommt jedes Control und damit die Anzeige in den Wahnsinn getrieben, wenn man nur schnell genug versucht dort Daten hinein zu pusten. Je aufwändiger das Erzeugen der Darstellung ist, umso schneller erreicht man den Zustand "geht nix mehr".

Darum ja auch die Trennung von Darstellung, Daten und Code.

Der Thread sollte die Daten in einen Speicher schreiben.
Der Speicher signalisiert, dass neue Daten vorhanden sind.
Die Anzeige nimmt dieses Signal zur Kenntnis und stellt die Daten (aus dem Speicher) dar, wenn Zeit dafür da ist.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 08:31
Also konkrete Hilfe kann ich nicht geben, aber...

Schau mal (wenn Du das irgendwie erkennen kannst), wie oft das Control sich zeichnet. Wenn Du z.B. einem Panel die aktuelle Breite nochmal zuweist, zeichnet es sich (und die Umgebung ebenfalls) nochmal neu.
Wenn das Wiederholt-Neuzeichnen in einem Control gekapselt wäre ist dem vielleicht schlecht beizukommen.

Aber vielleicht kannst Du mit Ersetzen von
MyChart.Widht := 100 durch
Delphi-Quellcode:
if MyChart.Widht <> 100 then
  MyChart.Widht := 100
oder mit ähnlichen Maßnahmen schon etwas erreichen.


Ansonsten wäre es vielleicht möglich, das Chart in einem Thread ein Bitmap erzeugen zu lassen und wenn das fertig ist, dieses in´s Formular zu kopieren. Ist natürlich umständlich und ggf. schwierig, aber vielleicht als Notlösung machbar.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 08:55
Mein 20 Sekunden-Test: Mache ich beim Chart das GDI+-AntiAlias aus, geht die Zeichnzeit von 516ms auf 37ms runter

(Und mit OpenGL habe ich 0ms)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 13:52
Danke für eure Antworten!

Mein 20 Sekunden-Test: Mache ich beim Chart das GDI+-AntiAlias aus, geht die Zeichnzeit von 516ms auf 37ms runter

(Und mit OpenGL habe ich 0ms)
Oh man. Du bist mein Held! Das war es! Vielen Dank!

Ich hatte schon sowas vermutet, konnte aber auf den ersten Blick nichts finden. Und eine Google-Suche nach TChart AntiAliasing hatte mich eher zu der Annahme geführt, dass man das AntiAliasing erst aktiv einschalten müsste: http://www.teechart.net/support/view...t=13164#p60730 Chart1.Tools.Add(TAntiAliasTool);

Wenn ich aber mal auf das Chart doppelklicke, Chart -> 3D -> Renderer da ist dort in der Tat unter GDI+ ein "AntiAlias" Häkchen versteckt. Und siehe da: In der Tat nur 31ms fürs zeichnen. Und wenn ich statt GDI+ nur GDI nehme, schafft er das Ganze sogar auch in 0ms. Wow!

Wie schalte ich denn OpenGL ein? Oder gibts das erst ab einer höheren TeeChart Version? Bei mir in der Palette ist nur unter "TeeChart Lite" "TTeeGDIPlus" und bei "Renderer" hatte ich nur "GDI" und "GDI+" in der Liste.

Darum ja auch die Trennung von Darstellung, Daten und Code.

Der Thread sollte die Daten in einen Speicher schreiben.
Der Speicher signalisiert, dass neue Daten vorhanden sind.
Die Anzeige nimmt dieses Signal zur Kenntnis und stellt die Daten (aus dem Speicher) dar, wenn Zeit dafür da ist.
Ja, da hast du auf jeden Fall recht.

Das Hauptprogramm macht das auch. Der Thread pusht die verarbeiteten Daten per PostMessage an ein Fenster, was die Werte erstmal in verschiedene TList<TRecord> ablegt und dem Frame, wo die Charts draufliegen, danach "bescheid" sagt. Da hatte ich schonmal mit den TimeOuts herumgespielt. Hat nichts gebracht. Weil wie schon gesagt, er brauchte ja für das Darstellen eines nackten Charts schon ~500ms.

Aber siehe oben: Der Tipp von Günther hats gebracht!

...also auf den ersten Blick fehlen mir da Series.BeginUpdate und Series.EndUpdate. Das beschleunigt das zeichnen schon etwas. Die LineSeries könntest/solltest Du zu FastLineSeries machen.
Außerdem solltest Du das Scrollen (SetBounds) vor dem EndUpdate handeln, sonnst muss er ja alles nochmal zeichnen.
Das hatte ich schon probiert und leider keinen signifikanten Unterschied gemerkt. Habs grad eben nochmal reaktiviert, und es macht in der Tat leider keinen Unterschied.

Delphi-Quellcode:
procedure TForm1.Chart_BeginUpdate;
var
  i: Integer;
begin
  for i := 0 to 4 do
    begin
      Chart1.Series[i].BeginUpdate;
      Chart2.Series[i].BeginUpdate;
    end;
end;

procedure TForm1.Chart_EndUpdate;
var
  i: Integer;
begin
  for i := 0 to 4 do
    begin
      Chart1.Series[i].EndUpdate;
      Chart2.Series[i].EndUpdate;
    end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  ST, ET, TT: Cardinal;
begin
  ST := GetTickCount;

  Chart_BeginUpdate;
  try
    PlotMeanData;
    PlotValueData;
    HandleScroll;
  finally
    Chart_EndUpdate;
  end;

  ET := GetTickCount;
  TT := ET - ST;
  Label1.Caption := 'Draw Time: ' + TT.ToString + 'ms';
end;
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 15:50
Ich habe TeeChart Pro, kann sein dass es OpenGL bei TeeChart Lite nicht gibt
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: [XE7, VCL] Wie TChart-Zeichnen beschleunigen?

  Alt 1. Jul 2015, 16:27
Ok. Danke. Das normale GDI sieht zwar jetzt nicht so schick aus, aber es erfüllt seinen Zweck allemal.
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz