-
Исходники в шапке. Я лишь добавил подсчёт что сколько раз выполнялось. И второе окно с этим же, но с хранением в TImage. И запустил, и узрел чудовищную тормознутость TPaintBox. И привёл цифры. 23000000 вызовов продолжающих плодиться - против фиксированных 100000.
-
А сам "Гена"-то тут или не тут, ау?
Берём ваш код из шапки:
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()...
-
An a Student (18.12.16 17:50) [21]
Я кажется тебя понял - ты предлагаешь рисовать линии один раз, скажем, в Bitmap, а по перерисовке рисовать уже готовый Bitmap. С этим спорить не имеет смысла, так действительно будет быстрее.
-
> [15] An a Student (18.12.16 15:58) > когда это посчитает нужным VCL
Ты крут, чё.
VCL работает в вакуумном пространстве совсем без Windows.
-
> [15] An a Student (18.12.16 15:58)
Ещё к этому же. Есть разные классы окон, надо почитать основы построения Виндоус.
-
> [18] An a Student (18.12.16 16:23) > при этом количество вызовов MoveTo и LineTo достигают 23000000 > и продолжают плодиться
При таком подходе - с векторной графикой - можно прорисованную картинку хранить в битмап и выводить уже его при необходимости обновления окна. А вот когда картинка изменилась, - например, масштаб изменили или новую линию добавили, - сохранить её в уже обновлённую для последующей выдачи без перерасчёта.
-
> А сам "Гена"-то тут или не тут, ау?
Зачем звал? Я задал вопрос, почти сразу получил ответ. А вы дальше спорите про PaintBox vs Image. Темы вопроса оно никак не касается.
-
> An a Student (18.12.16 17:50) [21]
Почему бы не сделать DrawLines регулярной процедурой, а не методом формы?
|