Einzelnen Beitrag anzeigen

nuclearping

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

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

  Alt 1. Jul 2015, 14: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