AGB  ·  Datenschutz  ·  Impressum  







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

Flakern trotz DoubleBuffer?

Ein Thema von xZise · begonnen am 22. Jun 2006 · letzter Beitrag vom 22. Jun 2006
Antwort Antwort
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

Flakern trotz DoubleBuffer?

  Alt 22. Jun 2006, 16:46
Bei mit Flackert eine ProgressBar und ein TLabel, trotz
DoubleBuffered := true ! Habe ich da einen Fehler gemacht?

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  i, j, Start, l : Integer;
  k : Extended;
  p: ^PixArray;
begin
  Start := GetTickCount;

  PBProgress.Max := Image.Height * Image.Width * 3;
  PBProgress.Position := 0;

  k := 255 / (TBColors.Position - 1);

  for i := 0 to Image.Height - 1 do begin

    p := Image.Picture.Bitmap.ScanLine[i];

    for j := 0 to Image.Width do begin

      for l := 1 to 3 do begin
        p^[l] := Round(Round(p^[l] / k) * k);

        PBProgress.Position := PBProgress.Position + 1;
        PBProgress.Refresh;
      end;


      LTime.Caption := 'Working (' + IntToStr((GetTickCount - Start) div 1000) + ' s)';
      LTime.Refresh;

      inc(p);
    end;
    if CBRefresh.Checked then
      Image.Repaint;
  end;

  LTime.Caption := 'Ready (' + FloatToStr((GetTickCount - Start) / 1000) + ' s)';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := true;
end;
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Flakern trotz DoubleBuffer?

  Alt 22. Jun 2006, 16:53
Verwende anstelle von Repaint lieber invalidate. Dadurch hat bei mir das flackern aufgehört.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Flakern trotz DoubleBuffer?

  Alt 22. Jun 2006, 16:57
Danke! Manchmal zuckt er noch, aber ansonsten funktioniert es auf jeden falle besser. Allerdings funktioniert es nicht bei Image.invalidate!
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: Flakern trotz DoubleBuffer?

  Alt 22. Jun 2006, 17:03
Hi,
es gibt mindest. zwei Dinge.
Das erste ist, DoubleBuffered muss für das direkte Elterncontrol gesetzt werden, liegt also dein ProgressBar auf einem Control (z.B. einem Panel), muss für dieses getrennt das DoubleBuffered gesetzt werden.
Ansonsten kann es sein, dass du dein ProgressBar an sich viel zu häufig neu zeichnest. Eine Zuweisung des Fortschritts führt hier immer zum Neuzeichnen. Es ist einfacher, wenn du ein wenig die ALU mit dem Dreisatz bemühst und 'nur' Werte zwischen 0 und 100 zuweist. Wenn du hier ausrechnest, wieviel Prozent du vom gesamten Fortschritt hast und nur den Wert zuweist, wenn sich auch was geändert hat, dann wird deutlich seltener neu gezeichnet und es bleibt eine Menge mehr Rechenzeit für den Rest.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Flakern trotz DoubleBuffer?

  Alt 22. Jun 2006, 17:10
Zitat von Der_Unwissende:
Das erste ist, DoubleBuffered muss für das direkte Elterncontrol gesetzt werden, liegt also dein ProgressBar auf einem Control (z.B. einem Panel), muss für dieses getrennt das DoubleBuffered gesetzt werden.
Ist direkt auf der Form!

Zitat von Der_Unwissende:
Ansonsten kann es sein, dass du dein ProgressBar an sich viel zu häufig neu zeichnest. Eine Zuweisung des Fortschritts führt hier immer zum Neuzeichnen. Es ist einfacher, wenn du ein wenig die ALU mit dem Dreisatz bemühst und 'nur' Werte zwischen 0 und 100 zuweist. Wenn du hier ausrechnest, wieviel Prozent du vom gesamten Fortschritt hast und nur den Wert zuweist, wenn sich auch was geändert hat, dann wird deutlich seltener neu gezeichnet und es bleibt eine Menge mehr Rechenzeit für den Rest.
Hast du recht, aber so war es einfacher xP Mal sehen ^^

Das mit der Zeitanzeige (sind ja nur Sekunden) dachte ich auch vielleicht zu verbessern, wenns eine ist:
Delphi-Quellcode:
if {Wert den man hat} <> LTime.caption then
  LTime.caption := {Wert}
Ist das leistungssteigerend? Weil da ist dann ja immerhin eine If-abfrage hinzugekommen!
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Flakern trotz DoubleBuffer?

  Alt 22. Jun 2006, 17:29
die If-Abfrage ist bedeutend schneller als wenn immer weider neu gemalt werden muss. Denn beim malen werden in Paintroutinen auch Abfragen duchgeführt bzw. ist da ja schon die Case-Anweisung um die Message für's neumalen auzuwerten.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#7

Re: Flakern trotz DoubleBuffer?

  Alt 22. Jun 2006, 17:32
Nun ja, eine If-Abfrage ist so ziemlich nichts an Rechenzeit (da gibt es sogar Vorhersagemechanismen für). Das Neuzeichnen hingegen ist eine ganze Kette von Operationen, einfach mal viel viel viel mehr als eine If-Abfrage. Du kannst einfach gesagt ein weiteres If gegen jedes neuzeichnen völlig vernachlässigen.
Wie gesagt, es gilt auch (insbesondere) für deine Progressbar, nicht nur für die angezeigte Zeit. Die kannst du natürlich noch in einer Variable zwischenspeichern ((GetTickCount - Start) div 1000), da du hier weder einen String verwendest, noch die Umwandlung Integer->String, hast du schon die Rechenzeit raus, die eine If-Abfrage benötigt (wie gesagt, dass Neuzeichnen kommt noch extra hinzu).
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Flakern trotz DoubleBuffer?

  Alt 22. Jun 2006, 17:34
Ah danke!

Eine Frage:
Wenn ich 300 Elemente habe (3x if (10,10,3)), wie passe ich dann die Bar an, dass er alle 3 einen "vorgeht"?
Bisher habe ich das damit gelöst:
Round(100 * ((i * j * l) / (Image.Height * Image.Width * 3))) Zur Info:
- i,j und l sind Schleifenvariablen
- Image.Height, Image.width und die 3 (xP) sind die Schleifenmaximen!

Aber das scheints nicht zu tun ^^
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  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 22:10 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