Thema: Delphi Performance-Optimierung

Einzelnen Beitrag anzeigen

VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#3

AW: Performance-Optimierung

  Alt 17. Jul 2012, 11:44
Danke erstmal für deinen Tipp!
Habe mir gestern Abend noch ein paar Beiträge zu dem Thema durchgelesen und es hörte sich ja vielversprechend an, auch wenn ich es noch nicht zu 100% verstanden habe.
In der Hoffnung das zu ändern hab ich heute morgen einfach schnell ein kleines Programm zum Testen gemacht, welches nach ein bisschen rumprobieren auch funktionierte. Nun versuche ich, das ganze auf mein Hauptprogramm zu übertragen, ich erhalte jedoch immer einen Fehler. Gibt es da noch etwas über Scanline, das ich wissen müsste? Es scheint, als dürfte man "p^[X]" nur einmal benutzen, weil ich immer eine Exeption bekomme, wenn ich es ein zweites mal verwende, egal in welcher reihenfolge..

Hier mal eine Procedur (An der makierten Stelle kommt die Fehlermeldung):

Delphi-Quellcode:
procedure TForm1.AnalysePIC2;
type
PixArray = Array [1..3] of Byte;
VAR p: ^PixArray;
VAR X,Y,Farbtoleranz:Integer;
VAR RValSel,GValSel,BValSel:Byte;
Begin
// Standartwerte //
 PB_Small.Max:=PIC_Breite*3;
 PB_Small.Position:=0;
 AnyLine:=False;
 for X := 0 to PIC_Breite do
  Begin
  PB_Small.Position:=PB_Small.Position+1;
  for Y := 0 to PIC_Höhe do
   Begin
   Line[X,Y]:=False;
  End;
 End;
// /Standartwerte //

 PB_Main.Position:=PB_Main.Position+3;
 PIC_res.Assign(PIc_res2);
 Farbtoleranz:=Ceil(SB_Farbtoleranz.Position*255/100);
 RValSel:=GetRValue(Color_Analysefarbe.Selected);
 GValSel:=GetGValue(Color_Analysefarbe.Selected);
 BValSel:=GetBValue(Color_Analysefarbe.Selected);

 for Y := 0 to PIC_Höhe-1 do
  Begin
  PIC_Res.ScanLine[Y];
  for X:=0 To PIC_Breite-1 do
   Begin
   if SB_Farbtoleranz.Position>0 then
    Begin
    if (((Abs(RValSel-P^[3]))<=Farbtoleranz) AND ((Abs(GValSel-P^[2]))<=Farbtoleranz) AND ((Abs(BValSel-P^[1]))<=Farbtoleranz)) then
     Begin
     AnyLine:=True;
     Line[X,Y]:=True;
     LinePTK:=LinePTK+1;
    End
    else
     Begin
     //Weiß
p^[3]:=255;
Delphi-Quellcode:
 
     p^[2]:=255;
     p^[1]:=255;
     Inc(p);
    End;
   End
   Else
    Begin
    if ((p^[3]=0) AND (p^[2]=0) AND (p^[1]=0)) then
     Begin
     AnyLine:=True;
     Line[X,Y]:=True;
     LinePTK:=LinePTK+1;
    End
    else
     Begin
     p^[3]:=255; //Weiß
     p^[2]:=255;
     p^[1]:=255;
     Inc(p);
    End;
   End;
  End;
 End;

.
.
.
Was mache ich denn falsch?

Und zu dem Inline: Verstehe ich es richtig, dass es also die Programmgeschwindigkeit erhöht, weil der PC dann nicht "hin und her springen" muss? Aber warum macht man das dann nicht immer? Die Datei wird vielleicht ein bisschen größer, aber soviel kann das doch nicht ausmachen, oder?

Geändert von VkPenguin (17. Jul 2012 um 11:48 Uhr)
  Mit Zitat antworten Zitat