Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Работа с TBitmap. Как быстрее?   Найти похожие ветки 

 
kurolesov   (2012-06-12 16:21) [0]

Прошу строго не судить - только пытаюсь изучать.

Необходимо в приложении отрисовывать свой битмап.

Создаю битмап.
Рисую на нем.
В дальнейшем через bitblt отрисовываю мой битмап на TImage
BitBlt(Image.Picture.Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, SRCCOPY);

Прорисовываю на битмап очень часто, в дальнейшем для отрисовки на image приходится вызывыть Image.Repaint;

Немного запутался с форматами битмапа. Какой формат выбрать для более быстрой отрисовки?

Насколько я понимаю, если не использую сканлине то лучше установить pfDevice. А если нужно scanline то лучше брать pf32bit чем pf24bit, правильно?


 
brother ©   (2012-06-12 16:37) [1]

> pf32bit

имхо


 
kurolesov   (2012-06-12 17:15) [2]

Что то по времени разницу не увидел между:

Image.Picture.Bitmap.PixelFormat:= pfDevice;
Bitmap.PixelFormat:= pfDevice;

Image.Picture.Bitmap.PixelFormat:= pf32bit;
Bitmap.PixelFormat:= pf32bit;

Но что то подсказывает что аппаратный вариант при pfDevice должен быть быстрее.
А почему вы считаете что pf32bit ? Ведь в данном случаи никакого ускорения нет. Я как понимаю лучше 32 чем 24 только для процессора, хотя размер в памяти будет больше.


 
Давайте будем жрать!   (2012-06-12 17:34) [3]


> Но что то подсказывает что аппаратный вариант при pfDevice
> должен быть быстрее.
«Аппаратный» это один из вариантов: 1, 4, 15, 16, 24, 32 бит. Если аппаратно цвет 32 бит, то между pfDevice и pf32bit никакой разницы не будет. Если бы аппаратно было 24 бита, то pf32bit проигрывал бы, и так далее.


> А почему вы считаете что pf32bit ?
Выравнивание.


 
kurolesov   (2012-06-12 18:01) [4]

Вероятно я много прочитал, а мало понял про  DDB формат.

- может все таки лучше использовать pfDevice? тоесть что "удобнее" устройству? так как я не могу знать где будет использоваться программа..


 
kurolesov   (2012-06-12 18:48) [5]

вот этот код:

 bmp:= TBitmap.Create;
 bmp.Width:= 2000;  bmp.Height:= 2000;

 if CheckBox1.Checked then
    bmp.PixelFormat:= pf32bit else
    bmp.PixelFormat:= pfDevice;

 bmp.Canvas.Brush.Color:= clGreen;
 bmp.Canvas.Font.Color:= clRed;
 bmp.Canvas.Font.size:= 12;

 for I := 0 to 999 do begin
    bmp.Canvas.FillRect(bmp.Canvas.ClipRect);
    bmp.Canvas.TextOut(i,i, "12345");
 end;

 bmp.Free;

при pfDevice работает на процентов 5-10 быстрее...


 
kurolesov   (2012-06-12 18:51) [6]

хм.. а при bmp.PixelFormat:= pf16bit  работает быстрее на процентов 40 чем при pfDevice.

Не могли бы вразумить?


 
Sapersky   (2012-06-12 21:36) [7]

На Win7 аппаратное ускорение GDI вполне может не работать, при этом pfDevice ничем не лучше pf32bit.
5-10% - это скорее всего погрешность измерений. Измеряй только время вывода, без создания, установки размеров и прочего.


 
kurolesov   (2012-06-12 22:06) [8]

Как раз на win7 и проверял.
Да и заметил, что отрисовка битмапа на Image стала явно быстрее визуально при
Image.Picture.Bitmap.PixelFormat:= pfDevice;
А кстати наоборот на XP при pf32bit и pfDevice почти одинаково.
Вероятно это зависит от режима видеоадаптера.

А чем\как можно заменить TImage?
Повторюсь, я часто (около 0.05мс) отрисовываю на битмапе картинку и далее для визуального отображения вывожу через BitBlt на TImage.. и в завершенее Image.refresh для отображения результата.


 
Германн ©   (2012-06-12 22:09) [9]


> Повторюсь, я часто (около 0.05мс) отрисовываю на битмапе
> картинку и далее для визуального отображения вывожу

20000000 раз в секунду для "визуального отображения"?


 
kurolesov   (2012-06-12 22:34) [10]

Ошибся.
5 сотых секунды.
В районе 50 раз в секунду.
Это в плане.
Алгоритм отрисовки ещё не оптимизировал.
Сейчас визуально видно, что при pfDevice отрисовка идет явно быстрее.
На 7-ке.


 
Давайте будем жрать!   (2012-06-12 22:36) [11]


> 5 сотых секунды.В районе 50 раз в секунду.
Чему нынче в школе учат?


 
kurolesov   (2012-06-12 22:46) [12]

Футбол.. Сбился )))
50 раз в секунду.


 
Sapersky   (2012-06-12 23:09) [13]

Сейчас визуально видно, что при pfDevice отрисовка идет явно быстрее. На 7-ке.

Ну в принципе 7-ка может и ускорять pfDevice, зависит от конкретной карты/драйвера.
Мне как-то больше попадалось наоборот, хотя я тестировал не FillRect и в целом не очень основательно.

А чем\как можно заменить TImage?

Если всё рисуется в одном битмапе, его можно выводить на канвас в TPaintBox. Или прямо на канвас формы, если приложение простое.


 
sniknik ©   (2012-06-13 00:27) [14]

> Сейчас визуально видно, что при pfDevice отрисовка идет явно быстрее.
если видно значит у тебя косяк с отрисовкой...

реально человек 25 кадров в сек от 50 на графиках отличить не может, если оно нормально сделано.


 
kurolesov   (2012-06-13 00:45) [15]

Да понятно что не может. Я на своем i7 хочу добиться 50 кадров.
Что бы запас был для менее слабых ПК, а так же какой-то слип добавить, что бы хоть с какой-то задержкой крутилось в потоке и выйти где-то  на 25 кадров.

Сейчас попробую отрисовывать на TPaintBox, но для меня TImage лучше тем, что я задал размер его битмапа по разрешению экрана и в дальнейшем не трачу время на просчет отрисовки, т.к. в моем случаи пользователь может и часто меняет масштаб выводимого изображения от мелкого до полноэкранного.


 
kurolesov   (2012-06-13 01:32) [16]

Не могли бы подсказать последний вопрос. -
Есть у меня поток в котором это дело по отрисовке битмапа крутится.

Как правильно нужно делать, что бы не грузить процессор?
Например обязательный должен быть sleep какой-то?
Или, напрнимер, если мне необходимо отрисовка 25 кадров в секунду, читать текущее время, проводить отрисовку и делать sleep до 1\25 сек. ?
Или это дело с нагрузкой процессора в потоках как-то по-другому решается?


 
brother ©   (2012-06-13 05:54) [17]

используй DXTimer и FastDIB, тогда и 3000 fps получишь)

> читать текущее время, проводить отрисовку и делать sleep
> до 1\25 сек. ?

нет, засечь текушее время, затем ждать и измерять дельту, как дельта равна или более нужного кол-ва мск - делать перерисовку...


 
brother ©   (2012-06-13 05:55) [18]

если с этим разберешься - будет рочень хорошо!
http://narod.ru/disk/52650580001.21735c29c1acf596922faeff2ee8511b/Life3.rar.html


 
kurolesov   (2012-06-13 09:41) [19]

Спасибо! неспеша разберусь )))


 
stas ©   (2012-06-13 11:27) [20]

kurolesov   (13.06.12 01:32) [16]
Может быть нужно DirectShow?


 
stas ©   (2012-06-13 11:28) [21]

и выводить как видео.


 
kurolesov   (2012-06-13 22:39) [22]

Самому в DirectShow лезть страшно.

Разрешите уточнить последний вопрос.
В принципе с FastDIB всё понятно.
Использую DelphiXE2, нашел последнюю версию данной библиотеки от сентября 2006 года.
Что-то дата смущает.
Есть ещё какая-то FastLIB и т.п., но их ещё не смотрел.
Кроме простых отрисовок необходимо разве что антиалиасинг делать.
Окончательно посоветуете на какой библиотеке остановиться?


 
sniknik ©   (2012-06-13 23:23) [23]

> Окончательно посоветуете на какой библиотеке остановиться?
выкинуть все, и остановиться на задаче... не возвращаться к ним пока реально не потребуется "ускорится", т.е. уже после оптимального алгоритма и т.д.
в общем не забивай голову мелочами не сделав главного, и не экономь "на спичках".


 
kurolesov   (2012-06-13 23:43) [24]

Так уже сделал. Вроде бы все что мог оптимизировал.
При выводе в полноэкранном режиме на разрешении full HD1920x...  появляются тормоза.
Может на 5-10% получится поднять скорость при использовании например FastDIB вместо TBitmap.
Вот ещё нашел graphics32.org. Даже не знаю на чем остановиться.


 
Sapersky   (2012-06-14 01:21) [25]

FastLIB (= FastDIB) официально не развивается, реально последняя версия скорее даже 2001-го года. По мелочи кто-то что-то для себя дописывает (я, например), но оформлять и выкладывать ленится.
Сборка с примерами от автора:
http://sapersky.narod.ru/files/FastLIBv389i.rar

Graphics32 по многим пунктам лучше - функциональнее (есть визуальные компоненты вроде TImage, элементы векторной графики), есть документация, библиотека развивается, написана в "правильном" ООП-стиле. Фастлиб зато в целом проще и несколько быстрее.

Вроде бы все что мог оптимизировал.
При выводе в полноэкранном режиме на разрешении full HD1920x...  появляются тормоза.


TImage используется не в режиме масштабирования?
Сколько и чего рисуется? Как картинка изменяется? (может, не надо на каждом кадре всё перерисовывать).


 
kurolesov   (2012-06-14 01:48) [26]

Спасибо, сейчас поизучаю примеры.

От TImage отказался.

У меня пока что в потоке отрисовываются по очереди два битмапа. Размер битмапа зависит от разрешения монитора, т.к. отрисовывать нужно в полный экран + качественно.

Приложение 1\25сек. запрашивает текущий битмап (по ходу может вывести ещё свой мелкий битмап поверх.) и отрисовывает его на PaintBox"e, который находится один на полноэкранной форме.

В процедуре отрисовки в потоке часто использую FillChar и часто использую проверку на длину строки canvas.textWidth.


 
Sapersky   (2012-06-14 02:46) [27]

FillChar - это FillRect, что ли, или именно FillChar через доступ к пикселям?
Лучше бы написал подробнее и/или со скриншотом.
А так могу только предположить, что текст выводится слишком качественно, со всякими сглаживаниями, и поэтому медленно.

BitBlt картинки на экран вряд ли тормозит... это 200 мб/c где-то, по современным меркам не так много. Но можно проверить на всякий случай.

Ещё может быть, синхронизация потока отрисовки с основным неудачно сделана.


 
sniknik ©   (2012-06-14 08:02) [28]

> Вроде бы все что мог оптимизировал.
не видно, что ты там на оптимизировал но, пока жалобы на тормоза в не самой "напряжной" по сути операции, а ищешь где угодно только не в своем коде...  предполагаю оптимизации ноль. да что там ноль, скорее в минусе, до нормально, средне написанного не дотягивает.

p.s. искать нужно не там где хочется, а там где нужно.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.051 c
15-1328409323
Псарь
2012-02-05 06:35
2013.03.22
Восстановить .txt.


15-1352808457
AV
2012-11-13 16:07
2013.03.22
Number Oracle и числа в "православной". Не хватает Cardinal`a


4-1258957583
pg81
2009-11-23 09:26
2013.03.22
Как получить в переменную frm:TForm зная Handle окна?


3-1284687349
Александр Т
2010-09-17 05:35
2013.03.22
Трехзвенка: зависание при одновременном подключении клиентов


2-1337107819
Валерий
2012-05-15 22:50
2013.03.22
Экспорт отчетов Fast Report в Open Office из Delphi