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

Вниз

Можно ли ускорить BitBlt?   Найти похожие ветки 

 
Multy   (2006-08-05 12:00) [0]

Вобщем нужно скопировать содержимое окна приложения в битмап.

   Wd - указатель окна
   BMP:= TBitmap.Create;
   Windows.GetClientRect(WD, ARect);
   with BMP, ARect do
   begin
      Width := ARect.Right - ARect.Left;
      Height := ARect.Bottom - ARect.Top;
      WinDC:=GetWindowDC(wd);// получаем для окна контекст устройства
      BitBlt(Canvas.Handle, 0, 0, Width, Height, WinDC, 0, 0, SRCCOPY);
   end;

Всё хорошо, только BitBlt работает очень медленно, нельзя ли как-то это ускорить?
Или, может быть, есть другие функции.


 
Eraser ©   (2006-08-05 13:03) [1]

> Можно ли ускорить BitBlt?

наверное можно, если M$ исходниками поделится.


 
Multy   (2006-08-05 15:15) [2]

Странно, вообще SaveToFile работает быстрее.
Впечатление, что происходит что-то типа:
 for j:=0 to BMP.Height-1 do
   for i:=0 to BMP.Width-1 do
      BMP.Pixel[i,j]:=GetPixel(WinDC,i,j);


 
Deka ©   (2006-08-05 17:06) [3]

Я бы не пользовался with. Попробуй указать все переменные полностью. А быстрее BitBlt вроде ничего нету. Разве что она формат как-нить преобразовывает по ходу работы...


 
Sapersky   (2006-08-05 19:32) [4]

Медленно это сколько?
Обычно создание битмапа и указание его ширины/высоты (т.е. выделение памяти) медленнее, чем собственно BitBlt.


 
Multy   (2006-08-05 22:37) [5]


> Я бы не пользовался with. Попробуй указать все переменные
> полностью. А быстрее BitBlt вроде ничего нету. Разве что
> она формат как-нить преобразовывает по ходу работы...


Причём сдесь with?

> Медленно это сколько?


BitBlt(Canvas.Handle, 0, 0, Width, Height, WinDC, 0, 0, SRCCOPY); При 800x600 32 составляет примерно 0.1 с и это при работе с оперативной памятью???


 
KilkennyCat ©   (2006-08-06 10:49) [6]

> это при работе с оперативной памятью???


Из приведенного Вами кода нифига не понятно, что и как Вы с оперативной памятью работаете. И непонятно, как Вы скорость оценили.
Не забывайте: то, что Вы думаете, что работаете с оперативной - не всегда верно; наибольшая скорость достигается при работе с памятью видеокарты;


 
Sapersky   (2006-08-06 12:35) [7]

При 800x600 32 составляет примерно 0.1 с

У меня весь экран 800*600*32 (P3-700 / GF2MX) копируется 20 мс (0.02 с). И это, в общем, нормальная скорость - AGP оптимизирована на передачу из системной в видеопамять, а не наоборот. PCI-Express в этом смысле лучше сбалансирована, да и CPU/Video там значительно более быстрые.
Если считать вместе с временем создания битмапа - 50 мс. Так что битмап лучше создавать заранее.


 
Sistr   (2006-08-07 18:01) [8]

2Deka
With??? Хм всю жизнь думал, что это только может каким то образом сказаться на скорость компиляции, ну уж никак не на выполнения кода в который этот самый with никак не интерпритируется


 
Multy   (2006-08-08 14:35) [9]


> Из приведенного Вами кода нифига не понятно, что и как Вы
> с оперативной памятью работаете. И непонятно, как Вы скорость
> оценили.
> Не забывайте: то, что Вы думаете, что работаете с оперативной
> - не всегда верно; наибольшая скорость достигается при работе
> с памятью видеокарты;


Что не понятного? Нужно скопировать содержимое окна в bitmap.
Похоже только никто в этом ничего не знает :(


 
clickmaker ©   (2006-08-08 15:05) [10]


> Multy   (08.08.06 14:35) [9]

а чего тут знать?
TcustomForm.GetFormImage()


 
Multy   (2006-08-08 16:20) [11]


> > Multy   (08.08.06 14:35) [9]
>
> а чего тут знать?
> TcustomForm.GetFormImage()


Смысл в том, что надо скопировать содержимое окна другого приложения.


 
clickmaker ©   (2006-08-08 16:31) [12]


> Multy   (08.08.06 16:20) [11]

а, ну так надо вопрос точнее задавать тогда.
В любом случае, быстрее BitBlt ничего нет


 
Multy   (2006-08-08 16:46) [13]


> а, ну так надо вопрос точнее задавать тогда.
> В любом случае, быстрее BitBlt ничего нет


Должно быть, поскольку, как уже писал, выполняется неправдоподобно медленно.


 
Don Nikola ©   (2006-08-08 18:09) [14]

2deka&sistr: С with будет быстрее, так как Delphi генерирует базовый адрес один раз, а потом просто добавляет смещение. Это я видел, кажеться, в 3-йке. Возможно это был единичный случай, не знаю.

2Multy: нужна скорость блита, то пользуй directdraw, там скорость реально веселая, особенно если кидаться поверхностями из видеопамяти туда же. Если нужно именно через GDI, то других вариантов, кроме как через BitBlt нет, хотя может быть GetDIBits как-нибудь поможет.
Также, возможно не оптимизированны другие моменты, например, стоит создавать битмап-приемник заранее, с тем же разрешением что и экран.


 
Ketmar ©   (2006-08-08 18:30) [15]

собственно, тут уже упоминали, что создание битмапа -- операция долгая. "члуше пол-дня потерять, а потом за 5 минут долететь" (ц)
т.е. создать и использовать много раз. желаьельно при этом размеры не трогать.


 
Multy   (2006-08-08 20:38) [16]


> собственно, тут уже упоминали, что создание битмапа -- операция
> долгая. "члуше пол-дня потерять, а потом за 5 минут долететь"
> (ц)
> т.е. создать и использовать много раз. желаьельно при этом
> размеры не трогать.


Битмап естественно того же размера и формата.


> 2Multy: нужна скорость блита, то пользуй directdraw, там
> скорость реально веселая, особенно если кидаться поверхностями
> из видеопамяти туда же. Если нужно именно через GDI, то
> других вариантов, кроме как через BitBlt нет, хотя может
> быть GetDIBits как-нибудь поможет.


Поясни как пользоватся directdraw? Хотя бы немножко примеров.


 
Ketmar ©   (2006-08-08 20:45) [17]

> [16] Multy   (08.08.06 20:38)

код из [0] битмап создаёт непосредственно перед операцией копирования. если это операция однормазовая -- то всё нормально. если это повторяется много раз -- надо громко плакать.


 
Multy   (2006-08-09 02:57) [18]

К стати если копировать прото bimap
BitBlt(BMP.Canvas.Handle, 0, 0, Width, Height,BMP.Canvas.Handle , 0, 0, SRCCOPY);
Получаетя в 15 раз быстрее, т.е. дело именно в том, что копируем из окна другого приложения.


 
Ketmar ©   (2006-08-09 09:55) [19]

> [18] Multy   (09.08.06 02:57)

всё-таки интересно, как осуществляются замеры.


 
clickmaker ©   (2006-08-09 10:34) [20]


> BitBlt(BMP.Canvas.Handle, 0, 0, Width, Height,BMP.Canvas.
> Handle , 0, 0, SRCCOPY);

это чё, сам в себя что-ли?


 
Don Nikola ©   (2006-08-09 19:11) [21]

2Multy:

>Поясни как пользоватся directdraw? Хотя бы немножко примеров.

Если тебе нужна функция копирования экрана в битмап, то вероятно dd тебе, скорее всего, не поможет.
Если тебе нужен просто блит, то схема примерно такая:
1 инициализация dd
2 создание первичной и вторичной поверхностей
3 создание поверхностей и загрузка в них данных
4 блит поверхностей на вторичную
5 флип(переключение) между первичной и вторичной, п.4
Если интересен пример работы, то могу кинуть некоторые свои сырцы на мыло.


 
KilkennyCat ©   (2006-08-09 19:37) [22]

> Если тебе нужна функция копирования экрана в битмап, то
> вероятно dd тебе, скорее всего, не поможет.


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


 
Don Nikola ©   (2006-08-09 20:14) [23]

2KilkennyCat:

Ну, не знаю... Я бы не стал ожидать ощутимого прироста в скорости от DD в оконном режиме, а вот проктологических вопросов будет весьма много ;)


 
XProger ©   (2006-08-09 23:11) [24]

Если предполагается последующее сохранение в файл, то весьма полезной окажется функция GetDIBits


 
Multy   (2006-08-10 06:50) [25]


> > [18] Multy   (09.08.06 02:57)
>
> всё-таки интересно, как осуществляются замеры.


Есть такой прибор называется "секундомер"


> Если тебе нужна функция копирования экрана в битмап, то
> вероятно dd тебе, скорее всего, не поможет.
> Если тебе нужен просто блит, то схема примерно такая:
> 1 инициализация dd
> 2 создание первичной и вторичной поверхностей
> 3 создание поверхностей и загрузка в них данных
> 4 блит поверхностей на вторичную
> 5 флип(переключение) между первичной и вторичной, п.4
> Если интересен пример работы, то могу кинуть некоторые свои
> сырцы на мыло.


Скинь плизз на multy2000@mail.ru, попробую разобраться. Мне, собственно, нужно только содержимое произвольного окна скопировать в bitmap


 
DeadMeat ©   (2006-08-10 08:43) [26]


> Есть такой прибор называется "секундомер"

А вот тут чуточку конкретней. Ибо много видов секундомеров есть.


 
clickmaker ©   (2006-08-10 10:54) [27]


> Есть такой прибор называется "секундомер"

что, натурально со спортивным секундомером сидел и жал на кнопку?


 
Don Nikola ©   (2006-08-10 15:52) [28]

2Multy:
мыло уйдет сегодня вечером.
Для замеров лучше пользовать серии из 10-100 однотипных вызовов, каждая серия обрамляется GetTickCount, первая, да и вторая серия в расчет не берутся.


 
DVM ©   (2006-08-10 22:37) [29]


> Всё хорошо, только BitBlt работает очень медленно, нельзя
> ли как-то это ускорить?

Ускорить нельзя.


 
homm ©   (2006-08-10 22:55) [30]

  Wd -              
  BMP:= TBitmap.Create;
  Windows.GetClientRect(WD, ARect);
  with BMP, ARect do
  begin
     Width := ARect.Right - ARect.Left;
     Height := ARect.Bottom - ARect.Top;

     WinDC:=GetWindowDC(wd);//                                      
     BitBlt(Canvas.Handle, 0, 0, Width, Height, WinDC, 0, 0, SRCCOPY);
  end;


Выделеные строки работают КУДА медленее чем BitBlt. Это при том что если работать напрямую с GDI от он битмап создает мгновенно.


 
Sapersky   (2006-08-11 10:34) [31]

Недавно обнаружил, что производительность GDI функций может зависеть от версии драйвера видеокарты. Тестировал, правда, не BitBlt, а StretchBlt.
Самое забавное (или печальное, как посмотреть) - новый драйвер тормознее старого, причём существенно, в 2-3 раза.
Возможно, дело в том, что он слишком новый (2005 г.в. для GF2MX).


 
kulibin   (2006-11-01 19:37) [32]

Могу посоветовать GetDIBits
Подробнее здесь http://sources.ru/cpp/bitmap/gdirotate.shtml


 
Ketmar ©   (2006-11-01 19:43) [33]

>[31] Sapersky 11-Aug-2006, 10:34
>Недавно обнаружил, что производительность GDI функций
>может зависеть от версии драйвера видеокарты.
вот удивительно-то... а мужики не в курсе. я всегда думал, что от драйвера мыши зависит...


 
guav ©   (2006-11-01 20:30) [34]

ну не всегда. вот если на принтер выводить то зависит от драйвера принтера.
(обычно stretchblt нормально воспринимает rectы большие чем фактический размер изображения, но нашёлся принтер, где это не работало, пришлось исправить).
если делать BitBlt на DIB, как здесь, не думаю, что какая-нибудь зависимость от драйвера видео проявится.


 
Psychedelic ©   (2006-11-02 01:44) [35]

>> Я бы не пользовался with.

Кто вам такую ерунду сказал?
С with быстрее. Попробуйте протрассировать сами увидите.


 
Ketmar ©   (2006-11-02 01:50) [36]

>[35] Psychedelic(c) 2-Nov-2006, 01:44
>С with быстрее
не факт. а вот запутаться в исходнике -- на раз. это факт. не зря профессор его аннулировал.


 
miek ©   (2006-11-03 13:11) [37]

Один момент: а ReleaseDC кто делать будет?


 
KilkennyCat ©   (2006-11-03 15:03) [38]

> [37] miek ©   (03.11.06 13:11)


точно. именно это и тормозит. :)))
и освобождения битмапа нет :)

Все, что нужно:
Битмап создать раньше, равно как и его характеристики. Где-нить в онкреате майнформы. А также проверить, что творится до вызова вышеприведенного куска кода. Может, там предварительно атомный взрыв просчитывается...
Дальнейшие варианты ускорения резко увеличивают трудоемкость, ибо можно дойти до покупки специфичной видеокарты, где BitBlt реализован лучше всех.



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

Форум: "WinAPI";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.032 c
3-1166690839
DelphiLexx
2006-12-21 11:47
2007.03.18
Как правильно спроектировать новую таблицу


15-1172081063
Ketmar
2007-02-21 21:04
2007.03.18
*nix -- удавить...


2-1172146562
VitAngel
2007-02-22 15:16
2007.03.18
Памагите разобраться в ошибке!


2-1172222511
Steep
2007-02-23 12:21
2007.03.18
Время


15-1171987658
Vendict
2007-02-20 19:07
2007.03.18
Проблемы с ICQ





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский