Как быстро выводить графику (a то Canvas очень медленно работает)
Вот пример заполнения формы точками случайного цвета:
type
TRGB = record
b, g, r: byte;
end;
ARGB = array[0..1] of TRGB;
PARGB = ^ARGB;
var
b: TBitMap;
procedure TForm1.FormCreate(sender: TObject);
begin
b := TBitMap.Create;
b.pixelformat := pf24bit;
b.width := Clientwidth;
b.height := Clientheight;
end;
procedure TForm1.Tim1OnTimer(sender: TObject);
var
p: PARGB;
x, y: integer;
beginfor y := 0 to b.height - 1 dobegin
p := b.scanline[y];
for x := 0 to b.width - 1 dobegin
p[x].r := random(256);
p[x].g := random(256);
p[x].b := random(256);
end;
end;
canvas.draw(0, 0, b);
end;
procedure TForm1.FormDestroy(sender: TObject);
begin
b.free;
end;
Here's the translation of the content into Russian:
Я рад помочь вам оптимизировать код для ускорения отображения графики.
Сначала давайте проанализируем, что вызывает медленность:
1. Генерация случайных цветов: вы генерируете случайные цвета внутри процедуры Tim1OnTimer, которая вызывается повторно. Это может привести к значительному влиянию на производительность.
2. Манипуляция битмапом: вы создаете и модифицируете объект TBitMap внутри события таймера, что涉гывает выделение памяти и освобождение.
Чтобы улучшить производительность:
Рекомендация 1: Предварительная генерация случайных цветов
Вместо генерации случайных цветов на каждом шаге таймера, предварительно сгенерируйте массив случайных значений цвета один раз при создании формы. Это можно сделать, создав отдельную процедуру, которая пополняет массив случайными значениями цвета. Затем в вашей процедуре Tim1OnTimer просто проитерировайте этот массив и нарисуйте соответствующие пиксели.
Рекомендация 2: Использование буфера для рисования
Вместо прямого изменения объекта TBitMap внутри события таймера создайте временный буфер (TBitmap) для хранения данных пикселей. Это уменьшит количество выделений памяти и освобождения, сделав ваш код более эффективным.
Вот обновленная версия вашего кода, которая включает в себя эти предложения:
typeTRGB=recordb,g,r:byte;end;ARGB=array[0..1]ofTRGB;PARGB=^ARGB;varb:TBitmap;randomColors:array[0..ClientWidth*ClientHeight-1]ofTRGB;// предварительно сгенерированные случайные цветаprocedureTForm1.FormCreate(sender:TObject);beginb:=TBitmap.Create;b.PixelFormat:=pf24bit;b.Width:=ClientWidth;b.Height:=ClientHeight;// Предварительная генерация случайных цветовfory:=0toClientHeight-1doforx:=0toClientWidth-1dorandomColors[x+y*ClientWidth].r:=random(256);randomColors[x+y*ClientWidth].g:=random(256);randomColors[x+y*ClientWidth].b:=random(256);end;procedureTForm1.Tim1OnTimer(sender:TObject);varp:PARGB;x,y:integer;begin// Создайте временный буфер для рисованияvartempBitmap:TBitmap;trytempBitmap:=TBitmap.Create;tempBitmap.PixelFormat:=pf24bit;tempBitmap.Width:=ClientWidth;tempBitmap.Height:=ClientHeight;fory:=0tob.Height-1dop:=tempBitmap.ScanLine[y];forx:=0tob.Width-1dop[x]:=randomColors[x+y*ClientWidth];// Нарисуйте временный буфер на канвасCanvas.Draw(0,0,tempBitmap);finallytempBitmap.Free;end;end;procedureTForm1.FormDestroy(sender:TObject);beginb.Free;end;
С помощью предварительной генерации случайных цветов и использования временного буфера для рисования вы должны заметить улучшение производительности.
В статье описывается способ ускорения отображения графики на Canvas в Delphi, путем создания и заполнения битмапа с использованием рекорда TRGB для хранения цветов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.