Конференция "Начинающим" » PaintBox.OnPaint [D7]
 
  • An a Student (18.12.16 16:45) [20]
    Исходники в шапке. Я лишь добавил подсчёт что сколько раз выполнялось. И второе окно с этим же, но с хранением в TImage.
    И запустил, и узрел чудовищную тормознутость TPaintBox. И привёл цифры. 23000000 вызовов продолжающих плодиться - против фиксированных 100000.
  • An a Student (18.12.16 17:50) [21]
    А сам "Гена"-то тут или не тут, ау?

    Берём ваш код из шапки:

    FromAr: array[0..99999] of TPoint;
    ToAr: array[0..99999] of TPoint;

    Button.OnClick
    begin
    {что-то делаю с FromAr и ToAr}
    end;

    PaintBox.OnPaint
    var
    i: Integer;
    begin
    for i := 0 to 99999 do begin
       PaintBox.Canvas.MoveTo(FromAr[i].X, FromAr[i].Y);
       PaintBox.Canvas.LineTo(ToAr[i].X, ToAr[i].Y);
    end;
    end;


    И переделываем вот так:

    type
       TLine = record
           A: TPoint;
           B: TPoint;
           C: TColor;
           W: Integer;
       end;
       TLines = array of TLine;

       TForm1 = class(TForm)
           ...
           procedure FormCreate(Sender: TObject);
           ...
       private
           ...
           Lines: TLines;
           ...
           procedure RandomizeLines();
           procedure DrawLines(C: TCanvas);
           ...
       public
       end;

    ...

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Randomize;
    DoubleBuffered:=true;
    SetLength(Lines, 100000);
    RandomizeLines();
    end;

    procedure TForm1.RandomizeLines();
    var i: integer;
    begin
    for i:=Low(Lines) to High(Lines) do
       begin
       Lines[i].A:=Point(RandomRange(0, 500), RandomRange(0, 500));
       Lines[i].B:=Point(RandomRange(0, 500), RandomRange(0, 500));
       Lines[i].C:=RGB(RandomRange(0, 255), RandomRange(0, 255), RandomRange(0, 255));
       Lines[i].W:=RandomRange(1, 3);
       end;
    end;

    procedure TForm1.DrawLines(C: TCanvas);
    var i: integer;
    begin
    for i:=Low(Lines) to High(Lines) do
       begin
       C.Pen.Color:=Lines[i].C;
       C.Pen.Width:=Lines[i].W;
       C.MoveTo(Lines[i].A.X, Lines[i].A.Y);
       C.LineTo(Lines[i].B.X, Lines[i].B.Y);
       end;
    end;


    Теперь мы можем в любом нужном месте вызвать DrawLines() и передать конкретный "Холст". Удобно. Гибко. Проще понимать и менять код.
    А можно вынести в TLines всё, будет классом инкапсулирующим массив TLine, с методом DrawTo()...
  • Игорь Шевченко © (18.12.16 19:37) [22]
    An a Student   (18.12.16 17:50) [21]

    Я кажется тебя понял - ты предлагаешь рисовать линии один раз, скажем, в Bitmap, а по перерисовке рисовать уже готовый Bitmap.
    С этим спорить не имеет смысла, так действительно будет быстрее.
  • Inovet © (18.12.16 20:09) [23]
    > [15] An a Student   (18.12.16 15:58)
    > когда это посчитает нужным VCL

    Ты крут, чё.

    VCL работает в вакуумном пространстве совсем без Windows.
  • Inovet © (18.12.16 20:14) [24]
    > [15] An a Student   (18.12.16 15:58)

    Ещё к этому же. Есть разные классы окон, надо почитать основы построения Виндоус.
  • Inovet © (18.12.16 20:27) [25]
    > [18] An a Student   (18.12.16 16:23)
    > при этом количество вызовов MoveTo и LineTo достигают 23000000
    > и продолжают плодиться

    При таком подходе - с векторной графикой - можно прорисованную картинку хранить в битмап и выводить уже его при необходимости обновления окна. А вот когда картинка изменилась, - например, масштаб изменили или новую линию добавили, - сохранить её в уже обновлённую для последующей выдачи без перерасчёта.
  • Гена (19.12.16 09:34) [26]

    > А сам "Гена"-то тут или не тут, ау?

    Зачем звал? Я задал вопрос, почти сразу получил ответ. А вы дальше спорите про PaintBox vs Image. Темы вопроса оно никак не касается.
  • Юрий Зотов © (20.12.16 14:20) [27]
    > An a Student   (18.12.16 17:50) [21]

    Почему бы не сделать DrawLines регулярной процедурой, а не методом формы?
 
Конференция "Начинающим" » PaintBox.OnPaint [D7]
Есть новые Нет новых   [118670   +55][b:0][p:0]