Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Canvas beim Zeichnen zu langsam (https://www.delphipraxis.net/70519-canvas-beim-zeichnen-zu-langsam.html)

holle 31. Mai 2006 12:44


Canvas beim Zeichnen zu langsam
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich habe ein Programm geschrieben, das den Sortiervorgang von Bubblesort grafisch darstellt. Mein Problem: Bei 512 Elementen dauert der Sortiervorgang seeeehr lange. Ich habe schon alles versucht, jedoch schafft es anscheinend der Algortihmus nicht schneller. Der Rechner ist dabei immer zu 100% ausgelastet.
Wisst ihr vielleicht, wie ich mein Programm beschleunigen kann?

mfg holle

Klaus01 31. Mai 2006 13:26

Re: Canvas beim Zeichnen zu langsam
 
Hallo Marcel,

habe Deine Unit mal etwas abgeändert
kann man vielleicht noch etwas mehr optimieren - aber so ist es schon schneller.

Eine Bremse bei Dir war das Du bei jeder Tauschaktion, das ganze Bild neu aufgebaut hast.
Das dauert.Es ist aber nur nötig, die zwei Vertauschungen neu zu zeichnen und das macht die
Version unten.

Grüße
Klaus

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TDaten = record
    zahl: integer;
    farbe: TColor;
  end;

var
  Form1: TForm1;
  Daten: array of TDaten;
  l, r: integer;
  BMP: TBitmap;
implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
  var i: integer;
      temp_zahl: integer;
      temp_color: tColor;
begin
  randomize;

  SetLength(Daten,0);
  for i:=0 to 511 do
  begin
    SetLength(Daten,Length(Daten)+1);
    Daten[i].Zahl:=random(512)+1;;
    Daten[i].Farbe:=ClBlue;
  end;
  l:=0;
  r:=511;

      //DRAW
      With Form1.Canvas do
      begin
        brush.Color:=clWhite;
        rectangle(0,0,512,512);
        pen.Width:=1;
        for i:=0 to 511 do
        begin
          Pen.Color:=Daten[i].Farbe;
          Rectangle(i,Daten[i].Zahl,i+4,Daten[i].Zahl+4);
          Daten[i].Farbe:=ClBlue;
        end;
      end;
     //DRAW


  //BUBBLESORT
  repeat

  begin
    if Daten[l].Zahl > Daten[l+1].Zahl then
    begin

      // lösche rechteck an der alten Position
      Form1.canvas.pen.color:=clwhite;
      Form1.Canvas.Rectangle(l,Daten[l].Zahl,l+4,Daten[l].Zahl+4);
      Form1.Canvas.Rectangle(l+1,Daten[l+1].Zahl,l+1+4,Daten[l+1].Zahl+4);

      Temp_Zahl:=Daten[l].zahl;
      Daten[l].zahl:=Daten[l+1].zahl;
      Daten[l+1].zahl:=Temp_Zahl;


      // verschiebe Rechteck
      Form1.Canvas.Pen.Color:=clBlue;
      Form1.Canvas.Rectangle(l,Daten[l].Zahl,l+4,Daten[l].Zahl+4);
      Form1.Canvas.Rectangle(l+1,Daten[l+1].Zahl,l+1+4,Daten[l+1].Zahl+4);

      Temp_Color:=Daten[l].farbe;
      Daten[l].farbe:=Daten[l+1].farbe;
      Daten[l+1].farbe:=Temp_Color;

    end;
    inc(l);
    if l=r then
    begin
      dec(r);
      l:=0;
    end;

    for i:=r+1 to 511 do
      Daten[i].Farbe:=ClNavy;
    Daten[l].Farbe:=ClRed;
    Daten[l+1].Farbe:=ClGreen;
  end until l>=r;

end;

end.

holle 31. Mai 2006 14:04

Re: Canvas beim Zeichnen zu langsam
 
danke funktioniert super!
mfg holle

Union 31. Mai 2006 15:44

Re: Canvas beim Zeichnen zu langsam
 
@Klaus: Dir ist aber schon klar, dass Du nur den unsortierten Zustand zeichnest?

Klaus01 31. Mai 2006 15:56

Re: Canvas beim Zeichnen zu langsam
 
@Union,

ich zeichne einmal das unsortierte Bild
und danach jede Vertauschung.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:14 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