Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли ускорить BitBlt? [D7, WinXP]


Страницы:   1 2

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 работает очень медленно, нельзя ли как-то это ускорить?
Или, может быть, есть другие функции.


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

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


Ketmar   (2006-08-08 20:45:00) [22]

> [16] Multy   (08.08.06 20:38)

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


Multy   (2006-08-08 20:38:00) [23]


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


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


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


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


Ketmar   (2006-08-08 18:30:00) [24]

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


Don Nikola   (2006-08-08 18:09:00) [25]

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

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


Multy   (2006-08-08 16:46:00) [26]


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


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


clickmaker   (2006-08-08 16:31:00) [27]


> Multy   (08.08.06 16:20) [11]

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


Multy   (2006-08-08 16:20:00) [28]


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


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


clickmaker   (2006-08-08 15:05:00) [29]


> Multy   (08.08.06 14:35) [9]

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


Multy   (2006-08-08 14:35:00) [30]


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


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


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

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


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

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

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


KilkennyCat   (2006-08-06 10:49:00) [33]

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


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


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


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


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

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


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


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

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


Deka   (2006-08-05 17:06:00) [36]

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


Multy   (2006-08-05 15:15:00) [37]

Странно, вообще 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);


Eraser   (2006-08-05 13:03:00) [38]

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо