![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли ускорить BitBlt? [D7, WinXP]
Multy © (2006-08-05 12:00:00)Вобщем нужно скопировать содержимое окна приложения в битмап.
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 работает очень медленно, нельзя ли как-то это ускорить?
Или, может быть, есть другие функции.
KilkennyCat (2006-11-03 15:03:00) [1]> [37] miek © (03.11.06 13:11)
точно. именно это и тормозит. :)))
и освобождения битмапа нет :)
Все, что нужно:
Битмап создать раньше, равно как и его характеристики. Где-нить в онкреате майнформы. А также проверить, что творится до вызова вышеприведенного куска кода. Может, там предварительно атомный взрыв просчитывается...
Дальнейшие варианты ускорения резко увеличивают трудоемкость, ибо можно дойти до покупки специфичной видеокарты, где BitBlt реализован лучше всех.
miek (2006-11-03 13:11:00) [2]Один момент: а ReleaseDC кто делать будет?
Ketmar (2006-11-02 01:50:00) [3]>[35] Psychedelic(c) 2-Nov-2006, 01:44
>С with быстрее
не факт. а вот запутаться в исходнике -- на раз. это факт. не зря профессор его аннулировал.
Psychedelic (2006-11-02 01:44:00) [4]>> Я бы не пользовался with.
Кто вам такую ерунду сказал?
С with быстрее. Попробуйте протрассировать сами увидите.
guav (2006-11-01 20:30:00) [5]ну не всегда. вот если на принтер выводить то зависит от драйвера принтера.
(обычно stretchblt нормально воспринимает rectы большие чем фактический размер изображения, но нашёлся принтер, где это не работало, пришлось исправить).
если делать BitBlt на DIB, как здесь, не думаю, что какая-нибудь зависимость от драйвера видео проявится.
Ketmar (2006-11-01 19:43:00) [6]>[31] Sapersky 11-Aug-2006, 10:34
>Недавно обнаружил, что производительность GDI функций
>может зависеть от версии драйвера видеокарты.
вот удивительно-то... а мужики не в курсе. я всегда думал, что от драйвера мыши зависит...
kulibin (2006-11-01 19:37:00) [7]Могу посоветовать GetDIBits
Подробнее здесь http://sources.ru/cpp/bitmap/gdirotate.shtml
Sapersky (2006-08-11 10:34:00) [8]Недавно обнаружил, что производительность GDI функций может зависеть от версии драйвера видеокарты. Тестировал, правда, не BitBlt, а StretchBlt.
Самое забавное (или печальное, как посмотреть) - новый драйвер тормознее старого, причём существенно, в 2-3 раза.
Возможно, дело в том, что он слишком новый (2005 г.в. для GF2MX).
homm (2006-08-10 22:55:00) [9]
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 от он битмап создает мгновенно.
DVM (2006-08-10 22:37:00) [10]
> Всё хорошо, только BitBlt работает очень медленно, нельзя
> ли как-то это ускорить?
Ускорить нельзя.
Don Nikola (2006-08-10 15:52:00) [11]2Multy:
мыло уйдет сегодня вечером.
Для замеров лучше пользовать серии из 10-100 однотипных вызовов, каждая серия обрамляется GetTickCount, первая, да и вторая серия в расчет не берутся.
clickmaker (2006-08-10 10:54:00) [12]
> Есть такой прибор называется "секундомер"
что, натурально со спортивным секундомером сидел и жал на кнопку?
DeadMeat (2006-08-10 08:43:00) [13]
> Есть такой прибор называется "секундомер"
А вот тут чуточку конкретней. Ибо много видов секундомеров есть.
Multy (2006-08-10 06:50:00) [14]
> > [18] Multy (09.08.06 02:57)
>
> всё-таки интересно, как осуществляются замеры.
Есть такой прибор называется "секундомер"
> Если тебе нужна функция копирования экрана в битмап, то
> вероятно dd тебе, скорее всего, не поможет.
> Если тебе нужен просто блит, то схема примерно такая:
> 1 инициализация dd
> 2 создание первичной и вторичной поверхностей
> 3 создание поверхностей и загрузка в них данных
> 4 блит поверхностей на вторичную
> 5 флип(переключение) между первичной и вторичной, п.4
> Если интересен пример работы, то могу кинуть некоторые свои
> сырцы на мыло.
Скинь плизз на multy2000@mail.ru, попробую разобраться. Мне, собственно, нужно только содержимое произвольного окна скопировать в bitmap
XProger (2006-08-09 23:11:00) [15]Если предполагается последующее сохранение в файл, то весьма полезной окажется функция GetDIBits
Don Nikola (2006-08-09 20:14:00) [16]2KilkennyCat:
Ну, не знаю... Я бы не стал ожидать ощутимого прироста в скорости от DD в оконном режиме, а вот проктологических вопросов будет весьма много ;)
KilkennyCat (2006-08-09 19:37:00) [17]> Если тебе нужна функция копирования экрана в битмап, то
> вероятно dd тебе, скорее всего, не поможет.
Поможет. Но это будет все равно, что сделать капремонт двигателя через выхлопную трубу (с) анекдот про проктолога-автослесаря.
Don Nikola (2006-08-09 19:11:00) [18]2Multy:
>Поясни как пользоватся directdraw? Хотя бы немножко примеров.
Если тебе нужна функция копирования экрана в битмап, то вероятно dd тебе, скорее всего, не поможет.
Если тебе нужен просто блит, то схема примерно такая:
1 инициализация dd
2 создание первичной и вторичной поверхностей
3 создание поверхностей и загрузка в них данных
4 блит поверхностей на вторичную
5 флип(переключение) между первичной и вторичной, п.4
Если интересен пример работы, то могу кинуть некоторые свои сырцы на мыло.
clickmaker (2006-08-09 10:34:00) [19]
> BitBlt(BMP.Canvas.Handle, 0, 0, Width, Height,BMP.Canvas.
> Handle , 0, 0, SRCCOPY);
это чё, сам в себя что-ли?
Ketmar (2006-08-09 09:55:00) [20]> [18] Multy (09.08.06 02:57)
всё-таки интересно, как осуществляются замеры.