Последние записи
- Как убрать окно «Подтвердите повторную отправку формы»?
- Windows Driver Framework — подпись драйвера
- Функция GetCurrentProcessToken (processthreadsapi.h)
- With … do и вызов функции. Как получить указатель на сам объект?
- TChromium обработка клика
- Delphi 7: замостить TImage маленьким изображением
- Определить, что кнопка зажата сейчас
- ATmega128 — При появлении положительного фронта на входе PD3 запустить таймер-счётчик 0
- Можно вставить в HTML элемент из XML?
- Не получается запустить компьютер, при старте показывает no codec initialized
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
25th
Ноя
Самый быстрый способ прорисовки на компоненте Image
Posted by obzor under Delphi
Подскажите каким методом можно максимально уменьшить нагрузку на компьютер при прорисовке изображений на компоненте Image 1?
Я пробовал рисовать через Canvas.Draw — но если нужно рисовать много изображений и хорошей частотой кадров — начинаются лаги (даже если ограничить прорисовку только видимой частью изображения)
Так же пробовал рисовать через bitblt, но нагрузка тоже сильно не уменьшилась.
Пробовал через движок Andorra2d, но там, если я правильно понял — прорисовка идет только в само окно формы, на компонентах рисовать нельзя (по крайней мере такой информации я не нашел).
Можно ли средствами DirectX, OpenGL или еще какими-то сделать прорисовку изображений максимально быстрой на одном из визуальных компонентах (Image, PaintBox и т.д.)? И есть ли существенная разница в скорости прорисовки Bmp и Jpeg с учетом разницы размера файлов одинакового разрешения? Рисую на канве через компонент Timer.
Через SetDIBitsToDevice. Набросал пример, на форме PaintBox1 и кнопка:
const
W = 500; // ширина PaintBox
H = 500; // высота PaintBox
var
// массив пикселей (можно диначический, но там чуть сложнее)
Bits: array[0..H-1,0..W-1] of TColor;
BitsInfo: BITMAPINFO;
// отрисовка массива на устройство DC:
function DrawToDC(DC: HDC; X, Y, Width, Height: Integer): Integer;
begin
with BitsInfo.bmiHeader do
begin
biWidth := Width;
biHeight := -Height;
end;
Result := SetDIBitsToDevice(
DC,
X, Y, Width, Height,
0, 0, 0, Height,
@Bits, BitsInfo, DIB_RGB_Colors
);
end;
// рисуем точку
procedure Plot(x,y: Integer; C: TColor);
begin
if (x>=0) and (y>=0) and (x<W) and (y<H) then begin
Bits[y,x] := C;
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,t: Integer;
begin
Randomize;
t:=GetTickCount;
// очищаем поле для рисования
FillChar (Bits, W*H*4, 0);
// рисуем миллион точек!
for i := 1 to 1000000 do begin
Plot(Random(W), Random(H), RGB(Random(256),Random(256),Random(256)));
end;
DrawToDC(PaintBox1.Canvas.Handle, 0, 0, W, H);
ShowMessage(IntToStr(GetTickCount-t)+' мс');
end;
initialization
with BitsInfo, bmiHeader do
begin
biSize := SizeOf (bmiHeader);
biWidth := 0;
biHeight := 0;
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
biSizeImage := 0;
biXPelsPerMeter := 0;
biYPelsPerMeter := 0;
biClrUsed := 0;
biClrImportant := 0;
end;
Миллион точек рисует менее чем за 16 мс.
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)