Форум: "Начинающим";
Текущий архив: 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.08 c