Можно ли ускорить BitBlt?
От: Multy  
Дата: 08.08.06 12:40
Оценка:
Вобщем нужно скопировать содержимое другого окна приложения в битмап.

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 работает очень медленно, нельзя ли как-то это ускорить?
Или, может быть, есть другие функции.
Re: Можно ли ускорить BitBlt?
От: korzhik Россия  
Дата: 08.08.06 12:56
Оценка:
Здравствуйте, Multy, Вы писали:

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


M> Wd — указатель окна

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

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

M>Или, может быть, есть другие функции.

а color formats буферов совпадают? А то BitBlt не только битмапы копирует, но и конвертирует если color formats разный
Re[2]: Можно ли ускорить BitBlt?
От: Multy  
Дата: 08.08.06 15:41
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, Multy, Вы писали:


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


M>> Wd — указатель окна

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

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

M>>Или, может быть, есть другие функции.

K>а color formats буферов совпадают? А то BitBlt не только битмапы копирует, но и конвертирует если color formats разный


Совпадет.
Re[3]: Можно ли ускорить BitBlt?
От: Andrew S Россия http://alchemy-lab.com
Дата: 08.08.06 18:23
Оценка:
K>>а color formats буферов совпадают? А то BitBlt не только битмапы копирует, но и конвертирует если color formats разный

M>Совпадет.


Каким образом измерялась производительность? Непонятно, почему был сделан вывод о медленности BitBlt.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: Можно ли ускорить BitBlt?
От: Multy  
Дата: 08.08.06 22:57
Оценка:
Здравствуйте, Andrew S, Вы писали:

K>>>а color formats буферов совпадают? А то BitBlt не только битмапы копирует, но и конвертирует если color formats разный


M>>Совпадет.


AS>Каким образом измерялась производительность? Непонятно, почему был сделан вывод о медленности BitBlt.


Запомнили время до, сравнили после вот и измерели.

К стати если копировать прото bimap
BitBlt(BMP.Canvas.Handle, 0, 0, Width, Height,BMP.Canvas.Handle , 0, 0, SRCCOPY);
Получаетя в 15 раз быстрее, т.е. дело именно в том, что копируем из окна другого приложения.
Re[5]: Можно ли ускорить BitBlt?
От: Andrew S Россия http://alchemy-lab.com
Дата: 09.08.06 01:01
Оценка:
K>>>>а color formats буферов совпадают? А то BitBlt не только битмапы копирует, но и конвертирует если color formats разный

M>>>Совпадет.


AS>>Каким образом измерялась производительность? Непонятно, почему был сделан вывод о медленности BitBlt.


M>Запомнили время до, сравнили после вот и измерели.


M>К стати если копировать прото bimap

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

Не только в этом. Во-первых, вы копируете с экрана, а не просто перегоняете память\память, как в случае TBitmap->TBitmap (кажется, там по умолчанию DIB секции, хотя могу и ошибаться). Естественно, что для большинства видеоадаптеров это довольно медленно. Хотя с приходом PCI-E ситуация изменилась кардинально — теперь считывать из видеопамяти быстрее, чем копировать в нее (собственно, так и должно быть — чтение завсегда было быстрее записи при работе с системной памятью при прочих равных). Во-вторых, тот DC, с которого копируете вы, на самом деле обычный кусок экранного DC, с установленным клиппингом и регионом окна (если есть, конечно). Т.о., кроме просто копирования, в худшем случае gdi приходится еще и клиппинг делать. Это хотя и быстро, но время все-равно занимает.
Простейший способ проверить — копировать с экрана напрямую (GetDC(NULL), задавая прямоугольки == размерам окна. Если будет такая же производительность — тогда быстрее не получится, даже с использование DirectDraw. Да, еще у gdi весьма медленно реализована работа с палитрой при копировании _в_ палитризованный контекст\битмап. Думаю, вряд ли у вас это используется, но вдруг.

Вывод: не рассчитывайте получить производительность там, где ее быть не может.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Можно ли ускорить BitBlt?
От: Сашенька Украина  
Дата: 09.08.06 07:06
Оценка:
Здравствуйте, Multy, Вы писали:

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


M> Wd — указатель окна

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

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

M>Или, может быть, есть другие функции.

— если структура приложения позволяет попробуй вызывать фукции типа GetDC, GetWindowDC, один раз (например при старте приложения). так ты получишь частичный выиграш в скорости.

— или попробуй использовать CreateCompatibleDC — тоже должно также помочь
Re: Можно ли ускорить BitBlt?
От: Сашенька Украина  
Дата: 09.08.06 08:45
Оценка: :))
И не забывай вызывать ReleaseDC по окончанию, это так же на скорость влияет.
Re: Можно ли ускорить BitBlt?
От: volo  
Дата: 09.08.06 14:39
Оценка:
Здравствуйте, Multy, Вы писали:

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

M>Или, может быть, есть другие функции.


Для отдельных случаев — быстрее будет DrawDibDraw
я все свои приложения перевел с BitBlt на DrawDibDraw
Re[2]: Можно ли ускорить BitBlt?
От: Andrew S Россия http://alchemy-lab.com
Дата: 09.08.06 15:22
Оценка:
M>>Всё хорошо, только BitBlt работает очень медленно, нельзя ли как-то это ускорить?
M>>Или, может быть, есть другие функции.

V>Для отдельных случаев — быстрее будет DrawDibDraw

V>я все свои приложения перевел с BitBlt на DrawDibDraw

И совершенно напрасно, судя по всему И то, и то использует одни и те же сервисы DDI. По-крайней мере, по тестам разница в производительности — доли процента. А bitblt куда как удобнее. DrawDib предназначен несколько для других целей — воспроизведение потока. Впрочем, и тут я в нем уже смысла не вижу.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Можно ли ускорить BitBlt?
От: Аноним  
Дата: 19.09.06 12:53
Оценка:
Здравствуйте, Andrew S, Вы писали:


AS>И совершенно напрасно, судя по всему И то, и то использует одни и те же сервисы DDI. По-крайней мере, по тестам разница в производительности — доли процента. А bitblt куда как удобнее. DrawDib предназначен несколько для других целей — воспроизведение потока. Впрочем, и тут я в нем уже смысла не вижу.



The DrawDib functions provide high performance image-drawing capabilities
for device-independent bitmaps (DIBs). DrawDib functions support DIBs
of 8-bit, 16-bit, 24-bit, and 32-bit image depths.

DrawDib functions write directly to video memory. They do not rely on
functions of the graphics device interface (GDI).
Re[4]: Можно ли ускорить BitBlt?
От: Andrew S Россия http://alchemy-lab.com
Дата: 19.09.06 13:21
Оценка:
AS>>И совершенно напрасно, судя по всему И то, и то использует одни и те же сервисы DDI. По-крайней мере, по тестам разница в производительности — доли процента. А bitblt куда как удобнее. DrawDib предназначен несколько для других целей — воспроизведение потока. Впрочем, и тут я в нем уже смысла не вижу.


А>The DrawDib functions provide high performance image-drawing capabilities

А>for device-independent bitmaps (DIBs). DrawDib functions support DIBs
А>of 8-bit, 16-bit, 24-bit, and 32-bit image depths.

А>DrawDib functions write directly to video memory. They do not rely on

А>functions of the graphics device interface (GDI).

Не читайте перед обедом советских газет.

Лучше возьмите в руки более-менее приличный компилятор и напишите тесты. Уверяю, будете удивлены результатом. И это... изучите интерфейсы DDI, прежде чем постить откровенную глупость, пусть даже изначально и написанную не вами.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Можно ли ускорить BitBlt?
От: kero Россия  
Дата: 19.09.06 14:00
Оценка:
Жестко играют профессионалы
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[5]: Можно ли ускорить BitBlt?
От: Аноним  
Дата: 19.09.06 14:17
Оценка:
AS>Не читайте перед обедом советских газет.

http://www.microsoft.com/msj/0197/mfcp1/mfcp1.aspx


AS>Лучше возьмите в руки более-менее приличный компилятор и напишите тесты.


http://www.morgan-multimedia.com/review.htm

AS>Уверяю, будете удивлены результатом. И это... изучите интерфейсы DDI, прежде чем постить откровенную глупость,



http://windowssdk.msdn.microsoft.com/en-us/library/ms708083.aspx
http://www.google.com.ua/search?hl=ru&q=DrawDib+functions+write+directly+&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&meta=

AS>пусть даже изначально и написанную не вами.


Какой Вы эксперт, если в элементарных вещах не разбираетесь.
Re[6]: Можно ли ускорить BitBlt?
От: Andrew S Россия http://alchemy-lab.com
Дата: 19.09.06 14:24
Оценка:
AS>>Не читайте перед обедом советских газет.

А>http://www.microsoft.com/msj/0197/mfcp1/mfcp1.aspx



AS>>Лучше возьмите в руки более-менее приличный компилятор и напишите тесты.


А>http://www.morgan-multimedia.com/review.htm


AS>>Уверяю, будете удивлены результатом. И это... изучите интерфейсы DDI, прежде чем постить откровенную глупость,



А>http://windowssdk.msdn.microsoft.com/en-us/library/ms708083.aspx

А>http://www.google.com.ua/search?hl=ru&q=DrawDib+functions+write+directly+&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&meta=

AS>>пусть даже изначально и написанную не вами.


А>Какой Вы эксперт, если в элементарных вещах не разбираетесь.


Спасибо, посмеялся. Ветку со ссылками, думаю, можно в юмор Продолжать диалог с господином анонимом намбер 718 возможным не нахожу, от смеха живот заболел. Спасибо, право. Вы продлили мне жизнь как минимум на пару лет. Приходите еще!
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Можно ли ускорить BitBlt?
От: korzhik Россия  
Дата: 19.09.06 15:58
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Лучше возьмите в руки более-менее приличный компилятор и напишите тесты. Уверяю, будете удивлены результатом. И это... изучите интерфейсы DDI, прежде чем постить откровенную глупость, пусть даже изначально и написанную не вами.


Вот сделал тест BitBlt и DrawDibDraw: http://rsdn.ru/File/19450/BltTest.rar (на основе http://www.stereopsis.com/blttest/)
Результаты примерно одинаковые.
Re[6]: Можно ли ускорить BitBlt?
От: Andrew S Россия http://alchemy-lab.com
Дата: 19.09.06 18:01
Оценка:
AS>>Лучше возьмите в руки более-менее приличный компилятор и напишите тесты. Уверяю, будете удивлены результатом. И это... изучите интерфейсы DDI, прежде чем постить откровенную глупость, пусть даже изначально и написанную не вами.

K>Вот сделал тест BitBlt и DrawDibDraw: http://rsdn.ru/File/19450/BltTest.rar (на основе http://www.stereopsis.com/blttest/)

K>Результаты примерно одинаковые.

О чем я и говорил изначально. Так с чем вы не согласны тогда в моем постинге? Или, наоборот, согласны?
Кстати, тесты не совсем корректны (или совсем некорректны, как угодно). Попробуйте варьировать размеры копируемых ректанглов — на маленьких, например, DrawDib (в правильно приготовленном варианте) будет сливать, поскольку имеет в 1.5 раза больше параметров + вынужден часть из них постоянно анализировать, даже с учетом вызова begin.
Единственная библиотека\интерфейс, которые делают gdi по производительности блиттинга, из тех, что я отсматривал — это allegro. Да и тут, поверьте, разница далеко не в разы. Попробуйте, кстати, directx (ddraw, а не 3d). Еще одно удивление гарантирую
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[7]: Можно ли ускорить BitBlt?
От: korzhik Россия  
Дата: 19.09.06 18:15
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>>>Лучше возьмите в руки более-менее приличный компилятор и напишите тесты. Уверяю, будете удивлены результатом. И это... изучите интерфейсы DDI, прежде чем постить откровенную глупость, пусть даже изначально и написанную не вами.


K>>Вот сделал тест BitBlt и DrawDibDraw: http://rsdn.ru/File/19450/BltTest.rar (на основе http://www.stereopsis.com/blttest/)

K>>Результаты примерно одинаковые.

AS>О чем я и говорил изначально. Так с чем вы не согласны тогда в моем постинге? Или, наоборот, согласны?


Я занимаю нейтральную позицию. Пытаюсь для себя выяснить всё до конца.

AS>Кстати, тесты не совсем корректны (или совсем некорректны, как угодно). Попробуйте варьировать размеры копируемых ректанглов — на маленьких, например, DrawDib (в правильно приготовленном варианте) будет сливать, поскольку имеет в 1.5 раза больше параметров + вынужден часть из них постоянно анализировать, даже с учетом вызова begin.


Попробую.

AS>Единственная библиотека\интерфейс, которые делают gdi по производительности блиттинга, из тех, что я отсматривал — это allegro.


Спасибо, посмотрю.

> Попробуйте, кстати, directx (ddraw, а не 3d). Еще одно удивление гарантирую


А что должно получится? (а то времени особе нет на тесты) Тоже одинаково будет с bitblt?
Re[8]: Можно ли ускорить BitBlt?
От: Andrew S Россия http://alchemy-lab.com
Дата: 19.09.06 18:32
Оценка:
>> Попробуйте, кстати, directx (ddraw, а не 3d). Еще одно удивление гарантирую

K>А что должно получится? (а то времени особе нет на тесты) Тоже одинаково будет с bitblt?


У меня это медленнее. В общем, если не нужен прямой доступ к видеопамяти, то лучше пользоваться gdi и не ломать голову. Другое дело, что на специфичных задачах gdi может сливать — например, аллегро выигрывает (сильно) на палитре + там удобнее (на мой вкус) интерфейс copy (не blt, а именно copy). Но это все надо тестировать для конкретной задачи. К тому же, еще влияние оказывают видеодрайвера — например, на моей старой машине некоторые результаты наших собственных бенчмарков в качественном плане сильно отличаются. Но то, что gdi и drawDIB пользуются одним низкоуровневым интерфейсом — это даже не обсуждается
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[6]: Можно ли ускорить BitBlt?
От: ole! США http://files.rsdn.org/4543/rsdn.gif
Дата: 20.09.06 03:01
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Простейший способ проверить — копировать с экрана напрямую (GetDC(NULL), задавая прямоугольки == размерам окна. Если будет такая же производительность — тогда быстрее не получится, даже с использование DirectDraw.


это не верно
DirectDraw может держать картинку в видеопамяти, переключать плоскости (flip chain), делать батч вывод, работать в исключительном выделенном режиме а также синхронизироваться по фронту обратного хода луча. сделайте это в gdi.
my $.02
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.