Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Работа с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.07 c
2-1331874414
vassal
2012-03-16 09:06
2013.03.22
record`ы


15-1336936111
Рекрут
2012-05-13 23:08
2013.03.22
Укрепление памяти


3-1284466515
beginer
2010-09-14 16:15
2013.03.22
ibserver выгрузить bat-ником


2-1333351946
homeknight
2012-04-02 11:32
2013.03.22
Копирование TTreeView


15-1340051402
Юрий
2012-06-19 00:30
2013.03.22
С днем рождения ! 19 июня 2012 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский