Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.141.8.247] |
|
Сообщ.
#1
,
|
|
|
У меня острый приступ рукоблудия: в программе для визуализации данных научного характера решил заняться оптимизацией.
Вопрос есть по конкретному куску кода: image:TBitmap, двойной цикл по x,y, интенсивность из массива масштабируется на интервал 0-255, и далее image.Canvas.Pixels[x-1,y-1]:=(cc*($FF+1)+cc)*($FF+1)+cc; После чего image отрисовывается целиком на канвасе объекта TImage. Вроде все просто. Сам двойной цикл + расчет параметров для масштабирования до цикла для картинки 765х510 занимает порядка 683мс. За счет вынесения одной константы из формулы в цикле (по сути закешировал, расчет 1 раз) получил время 662мс. Дальше веселее: в цикле код не меняется. После image:=TBitmap.Create; добавил image.PixelFormat:= чего-то там и изучил влияние этого на время. not set ~ 672 ms pf8bit ~ 750 ms pf15bit ~ 235 ms pf16bit ~ 220 ms pf24bit ~ 203 ms pf32bit ~ 219 ms Кто может это объяснить? Везде среднее по 4 тестам, данные одни и те же. По умолчанию если не задать, там черт знает что, оно работет быстрее чем если заданное вручную "256 цветов", но тот же код существенно быстрее работает если после создания выставить pf32bit. |
Сообщ.
#2
,
|
|
|
Pixels - медленный способ доступа. Для каждого пиксела проводится куча операций, в том числе по преобразованию формата.
Например, pf8bit это режим с палитрой - похожий цвет ищется в палитре. Раз в сто будет быстрее, если использовать ScanLine или http://www.delphimaster.ru/articles/pixels/ |
Сообщ.
#3
,
|
|
|
Про кучу операций я согласен, но замена
image.Canvas.Pixels[x-1,y-1]:=(cc*($FF+1)+cc)*($FF+1)+cc; на апишное SetPixel(image.Canvas.Handle, X-1, Y-1, (cc*($FF+1)+cc)*($FF+1)+cc); из GDI32 не дает почти ничего. За ссылку спасибо, установив pf16bit добился снижения задержки отображения картинки 2048х2048 в 3 раза, 2 секунды пока приемлемо, но видимо придется учить ассемблер когда окончательно прижмет... |
Сообщ.
#4
,
|
|
|
Pixels использует SetPixel, он и есть медленный.
Ассемблер-то зачем учить? |
Сообщ.
#5
,
|
|
|
По ссылке почти весь код на асме.
Уже не зачем. Благодарю за идею, ScanLine'ом уменьшил время еще в 4 раза (220 -> 46 мс), только точки позеленели. В чем проблема уже знаю, сначала выясню какой для меня все таки оптимальный PixelFormat без палитры, а потом уже буду исправлять глюк. Это время уже приемлемое. |
Сообщ.
#6
,
|
|
|
Сверху статьи ссылка на модуль для 32-битных версий
|
Сообщ.
#7
,
Сообщение отклонено: Shaggy -
|