AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Performance Problem - viele VCL Komponenten!

Performance Problem - viele VCL Komponenten!

Ein Thema von weisswe · begonnen am 22. Aug 2011 · letzter Beitrag vom 23. Aug 2011
Antwort Antwort
Benutzerbild von stahli
stahli

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

AW: Performance Problem - viele VCL Komponenten!

  Alt 22. Aug 2011, 21:17
Ich weiß zwar nicht, wie die TMS-Controls sich zeichnen, aber am zeichnen selbst wird die Zerzögerung sicher nicht liegen.

Wird da noch irgend etwas berechnet oder so? Im XE gibt es AQTime, um solche Aufrufe zu analysieren. Vielleicht kannst Du eine Trial nutzen o.ä.
Meine Verzögerung lag daran, dass ich Streamdaten immer wieder neu entpackt habe beim Zeichnen. Ich hatte auch nicht erwartet, dass das so viel ausmacht...

Falls Du verschachtelte Ausrichtungen (Align, Anchors) und dynamische Größenänderungen nutzt, könnte das evtl. auch eine Ursache sein.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (22. Aug 2011 um 22:18 Uhr)
  Mit Zitat antworten Zitat
weisswe
(Gast)

n/a Beiträge
 
#2

AW: Performance Problem - viele VCL Komponenten!

  Alt 22. Aug 2011, 21:29
Wenn ich alle Controls INVISIBLE setze und dann alle wieder auf VISIBLE setze - hab ich schon das Problem, ohne irgendwelche Eingeschaften (Position, Größe, Farbe, ..) zu ändern.
Daraus schliesse ich, das es ein Zeichenproblem der Komponenten ist.

Habe auch schon einen Profiler über den Code gelegt (Zeitstempel). Da gibt es "keine" Performance-Probleme lauf Zeitmessung - selbst beim Zeichen aller Elemente - da - wenn alle Controls auf Visible in der Schleife gesetzt wurden - ja "parallel" bzw. danach der Bildschirmaufbau stattfindet - den ich ja nicht "kapseln" (stoppen) kann...
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.222 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Performance Problem - viele VCL Komponenten!

  Alt 22. Aug 2011, 21:41
Schon mal probiert das Panel auf DoubleBuffered = True zu setzen? Hilft bei einigen Controls
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
weisswe
(Gast)

n/a Beiträge
 
#4

AW: Performance Problem - viele VCL Komponenten!

  Alt 22. Aug 2011, 21:57
Schon mal probiert das Panel auf DoubleBuffered = True zu setzen? Hilft bei einigen Controls
Ja, hab ich
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Performance Problem - viele VCL Komponenten!

  Alt 22. Aug 2011, 22:05
Werden die Controls vielleicht mehrfach hintereinander gezeichnet?
Vielleicht wäre ein Test mit EINEM Sitzplatz sinnvoll um den genauen Ablauf besser nachzuvollziehen.

Ich bleibe dabei: Das reine Zeichnen eines Controls (oder auch 100) wird nicht so lange dauern, dass man eine deutliche Verzögerung bemerkt.
Ich habe in einem Projekt mal intensiv Alpha-Skins dynamisch eingesetzt. Das brachte dann schon eine Verzögerung, aber dabei sind ja wirklich komplexe Hintergründe zu berechnen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#6

AW: Performance Problem - viele VCL Komponenten!

  Alt 22. Aug 2011, 22:15
Ist Panel.AutoSize vielleicht True? Das würde bei jeder Inhaltsänderung ggf. ein Resize auslösen und damit die Neuberechnung?

Grüsse, Dirk
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.999 Beiträge
 
Delphi 12 Athens
 
#7

AW: Performance Problem - viele VCL Komponenten!

  Alt 22. Aug 2011, 23:55
Ich habe die Erfahrung gemacht das TMS einfach langsam zeichnet...wenn man mal die TAdvButtons nimmt...oder TShader oder TadvGrid die können einfach zu viel Feuerwerk....und die werden in Massen dann wirklich sehr sichtbar hintereinander gezeichnet....
Ist eben nur GDI+
Die Verhalten sich auf starren masken dann auch einfach besser als auf resizeable Forms!
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#8

AW: Performance Problem - viele VCL Komponenten!

  Alt 23. Aug 2011, 09:57
Moin, das Create und Notify ist als Zeitfresser schon ausgemacht. Damit sehe ich folgendes:

- Speed-Buttons sind schneller aufgebaut als Normal-Buttons
- Sammlungen aus Buttons können created invisible auf Position 0.0 vorgehalten werden.
- Das Panel mit den Buttons kann während des Aufbaus der Buttons auf invisible stehen.
- Das Panel mit den Buttons könnte bei Align-Top und Höhe 0 auf Align - Client geschaltet werden.
- Ein Image nehmen und bei Mouse-Click die Click-Position abfragen.
- Die Graph-Variante von Neumann klingt spannend.

Grüße in die Runde
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#9

AW: Performance Problem - viele VCL Komponenten!

  Alt 23. Aug 2011, 10:00
- Speed-Buttons sind schneller aufgebaut als Normal-Buttons
Zitat:
TSpeedButton = class(TGraphicControl)
Wenn es gar nicht anders geht und es unbedingt Einzelkomponenten sein müssen, dann kann es schon etwas bringen, diese nach Möglichkeit von TGraphicControl abzuleiten.
*Hihi*
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: Performance Problem - viele VCL Komponenten!

  Alt 23. Aug 2011, 10:33
wie wäre es mit sowas, nur als Anregung ....

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TPlatzrecord=Record
    x:Integer;
    y:Integer;
    b:Double;
    h:Double;
    farbe:TColor;
    Nr:Integer;
  End;

  TPlatzrecordArray=Array of TPlatzrecord;

  TForm1 = class(TForm)
    Button1: TButton;
    PaintBox1: TPaintBox;
    procedure Button1Click(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    FPlatzrecordArray:TPlatzrecordArray;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
const
 cColor:Array [0..9] of TColor=(clred,clBlue,cllime,clYellow,clmaroon,clSilver,clGray,clNavy,clBlack,clWhite);

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  x,y:Integer;
begin
    SetLength(FPlatzrecordArray,200);
    for x := 0 to 9 do
    for y := 0 to 19 do
      begin
      FPlatzrecordArray[y*10 + x].x := x;
      FPlatzrecordArray[y*10 + x].y := y;
      FPlatzrecordArray[y*10 + x].nr := y*10 + x;
      FPlatzrecordArray[y*10 + x].h := 0.8;
      FPlatzrecordArray[y*10 + x].b := 0.7;
      FPlatzrecordArray[y*10 + x].Farbe := cColor[y div 2];
      end;
    PaintBox1.Invalidate;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  scale:Double;
  x,y:Integer;
  c:TCanvas;
  r:TRect;
begin
  if High(FPlatzrecordArray)<>199 then Exit;

  Scale := paintBox1.Width / 20;
  if paintBox1.height / 20 < Scale then Scale := paintBox1.height / 20;
  c := PaintBox1.Canvas;
    for x := 0 to 9 do
    for y := 0 to 19 do
      begin
      r.Left := round(FPlatzrecordArray[y*10 + x].x * scale);
      r.Top := round(FPlatzrecordArray[y*10 + x].y * scale);
      r.Right := r.Left + round(FPlatzrecordArray[y*10 + x].b * scale);
      r.Bottom := r.Top + round(FPlatzrecordArray[y*10 + x].h * scale);
      c.Brush.Color := FPlatzrecordArray[y*10 + x].Farbe;
      c.FillRect(r);
      c.Rectangle(r.Left,r.Top,r.Right,r.Bottom);
      c.TextOut(r.Left + (r.Right - r.Left - c.TextWidth(IntToStr(FPlatzrecordArray[y*10 + x].nr))) div 2,
                r.top + (r.bottom - r.top - c.TextHeight(IntToStr(FPlatzrecordArray[y*10 + x].nr))) div 2,
                IntToStr(FPlatzrecordArray[y*10 + x].nr));

      end;



end;

end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort

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 07:05 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