Медленный BitBlt
От: Гришин Сергей Россия  
Дата: 07.08.02 10:17
Оценка:
Доброе время суток.

Необходимо захватить кусок экрана и взять с него биты, т.е.

ScreenDC := CreateDC('DISPLAY', nil, nil, nil);
MemDC := CreateCompatibleDC(ScreenDC);
Bitmap:= CreateDIBSection(ScreenDC,FBitInfo,DIB_RGB_COLORS, FBuffer,0,0);
SelectObject(memDC,Bitmap);
BitBlt(MemDC,0,0,1024,768,ScreenDC,0,0,SRCCOPY);

Так вот BitBlt в случае 1024х768х24 работает СЕКУНДУ !!!

Может кто подскажет, где собака зарыта.

P.S. GetDiBits работает также долго.
Re: Медленный BitBlt
От: Edmond  
Дата: 07.08.02 10:28
Оценка:
Здравствуйте Гришин Сергей, Вы писали:

ГС>Доброе время суток.


ГС>Необходимо захватить кусок экрана и взять с него биты, т.е.


ГС> ScreenDC := CreateDC('DISPLAY', nil, nil, nil);

ГС> MemDC := CreateCompatibleDC(ScreenDC);
ГС> Bitmap:= CreateDIBSection(ScreenDC,FBitInfo,DIB_RGB_COLORS, FBuffer,0,0);
ГС> SelectObject(memDC,Bitmap);
ГС> BitBlt(MemDC,0,0,1024,768,ScreenDC,0,0,SRCCOPY);

ГС>Так вот BitBlt в случае 1024х768х24 работает СЕКУНДУ !!!


ГС>Может кто подскажет, где собака зарыта.


ГС>P.S. GetDiBits работает также долго.



Ты захватываешь свой кусок экрана? Наверное нет...
С уважением, Edmond
Re[2]: Медленный BitBlt
От: Гришин Сергей Россия  
Дата: 07.08.02 10:31
Оценка:
Здравствуйте Edmond, Вы писали:

E>Ты захватываешь свой кусок экрана? Наверное нет...


Нет, захватываю вообще весь экран, но сути это не меняет. Переброска из DC в DIB длится СЕКУНДУ !
Re[3]: Медленный BitBlt
От: Edmond  
Дата: 07.08.02 10:53
Оценка:
Здравствуйте Гришин Сергей, Вы писали:

ГС>Здравствуйте Edmond, Вы писали:


E>>Ты захватываешь свой кусок экрана? Наверное нет...


ГС>Нет, захватываю вообще весь экран, но сути это не меняет. Переброска из DC в DIB длится СЕКУНДУ !


Видимо, по другому не выйдет.... Интересно а Принт скрин быстрей работает?
С уважением, Edmond
Re[4]: Медленный BitBlt
От: Гришин Сергей Россия  
Дата: 07.08.02 11:00
Оценка:
Здравствуйте Edmond, Вы писали:

E>Видимо, по другому не выйдет.... Интересно а Принт скрин быстрей работает?


прикол в том, что есть программа удаленной работы, которая не использует не OpenGL, ни DirectX, а экран хватает раз 10 в секунду
Re[5]: Медленный BitBlt
От: BugMan  
Дата: 15.08.02 20:25
Оценка:
Здравствуйте Гришин Сергей, Вы писали:

ГС>Здравствуйте Edmond, Вы писали:


E>>Видимо, по другому не выйдет.... Интересно а Принт скрин быстрей работает?


ГС>прикол в том, что есть программа удаленной работы, которая не использует не OpenGL, ни DirectX, а экран хватает раз 10 в секунду


Мона дурацкий вопрос? А нафига вам собссно DiB?
Попробуй CreateCompatibleBitmap()
Re[6]: Медленный BitBlt
От: Гришин Сергей Россия  
Дата: 16.08.02 05:12
Оценка:
BM>Мона дурацкий вопрос? А нафига вам собссно DiB?
BM>Попробуй CreateCompatibleBitmap()

Нужны пикселы. А после CreateCompatibleBitmap нужно использовать GetDiBits, что ткаже небыстро работает
Re[7]: Медленный BitBlt
От: BugMan  
Дата: 16.08.02 15:25
Оценка:
Здравствуйте Гришин Сергей, Вы писали:

BM>>Мона дурацкий вопрос? А нафига вам собссно DiB?

BM>>Попробуй CreateCompatibleBitmap()

ГС>Нужны пикселы. А после CreateCompatibleBitmap нужно использовать GetDiBits, что ткаже небыстро работает


Вот тебе код на VB, все отлично работает безо всяких Dib.......

Dim hDCMemory As Long
Dim hBmp As Long
Dim hBmpPrev As Long
Dim r As Long
Dim hdcsrc As Long

hdcsrc = GetWindowDC(hWndSrc) ' Get device context for entire window.

' Create a memory device context for the copy process.
hDCMemory = CreateCompatibleDC(hdcsrc)

' Create a bitmap and place it in the memory DC.
hBmp = CreateCompatibleBitmap(hdcsrc, WidthSrc, HeightSrc)
hBmpPrev = SelectObject(hDCMemory, hBmp)

' Copy the on-screen image into the memory DC.
r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hdcsrc, LeftSrc, TopSrc, vbSrcCopy)

' Remove the new copy of the on-screen image.
hBmp = SelectObject(hDCMemory, hBmpPrev)

' Release the device context resources back to the system.
r = DeleteDC(hDCMemory)
r = ReleaseDC(hWndSrc, hdcsrc)
Re[8]: Медленный BitBlt
От: Гришин Сергей Россия  
Дата: 19.08.02 05:30
Оценка:
Ты всего лишь копируешь из DC в DC. А ты попробуй из этого битмапа пикселы взять ...
Re: Медленный BitBlt
От: Alex Fedotov США  
Дата: 19.08.02 05:34
Оценка:
Здравствуйте Гришин Сергей, Вы писали:

ГС>Так вот BitBlt в случае 1024х768х24 работает СЕКУНДУ !!!


ГС>Может кто подскажет, где собака зарыта.


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

Смотри также:
http://www.rsdn.ru/forum/message.asp?mid=68051
Автор: orc
Дата: 29.06.02
-- Alex Fedotov
Re[9]: Медленный BitBlt
От: BugMan  
Дата: 19.08.02 14:48
Оценка:
Здравствуйте Гришин Сергей, Вы писали:

ГС>Ты всего лишь копируешь из DC в DC. А ты попробуй из этого битмапа пикселы взять ...


Секундочку!
Давайте разберемся, что именно вам надо, и что вы подразумеваете под "биты".

Вы абсолютно правильно заметили, что я скопировал DC в данном примере, но ведь основной идеей данной операции является копирование битмапа лежащего на этом DC.
Посмотрите на 3 с низу строку и вы увидите, что конечный результат этого примера есть хендл на битмап, если это НЕ то что вам нужно, то тогда я совсем ничего не понимаю......

PS Если вам нужно именно собержание битмапа, а не хендл, то используйте GetObject() что бы получить BITMAP структуру, где lpBits и есть биты.......
Re[10]: Медленный BitBlt
От: Alex Fedotov США  
Дата: 19.08.02 15:46
Оценка:
Здравствуйте BugMan, Вы писали:

BM>PS Если вам нужно именно собержание битмапа, а не хендл, то используйте GetObject() что бы получить BITMAP структуру, где lpBits и есть биты.......


lbBits будет NULL.
-- Alex Fedotov
Re[11]: Медленный BitBlt
От: BugMan  
Дата: 19.08.02 16:36
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>lbBits будет NULL.

хмммммммм...... действительно......
А может вы еще и знаете почему ?
Вообще странно как то, Неужели при выполнении операций описанных Edmond этот напрямую бежит по битмапу с GetPixel()..... слабо верится.....

PS: Мда.... деньги конечно вещь хорошая......
Re[12]: Медленный BitBlt
От: Alex Fedotov США  
Дата: 19.08.02 17:13
Оценка:
Здравствуйте BugMan, Вы писали:

AF>>lbBits будет NULL.


BM>хмммммммм...... действительно......

BM>А может вы еще и знаете почему ?

Потому что это DDB. Драйвер видеоадаптера решает, где физически расположены биты DDB. Это может быть либо видеопамять, либо paged pool. Ни та, ни другая память напрямую из user-mode не адресуется, поэтому lpBits равно NULL.

BM>Вообще странно как то, Неужели при выполнении операций описанных Edmond этот напрямую бежит по битмапу с GetPixel()..... слабо верится.....


Там просто слегка оптимизированный вариант memcpy работает.

BM>PS: Мда.... деньги конечно вещь хорошая......


Особенно когда их много.
-- Alex Fedotov
Re[13]: Медленный BitBlt
От: BugMan  
Дата: 19.08.02 17:24
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

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


AF>>>lbBits будет NULL.


BM>>хмммммммм...... действительно......

BM>>А может вы еще и знаете почему ?

AF>Потому что это DDB. Драйвер видеоадаптера решает, где физически расположены биты DDB. Это может быть либо видеопамять, либо paged pool. Ни та, ни другая память напрямую из user-mode не адресуется, поэтому lpBits равно NULL.


АХА ! А DDB надо понимать Device Dependent Bitmap , понятненько.......

BM>>Вообще странно как то, Неужели при выполнении операций описанных Edmond этот напрямую бежит по битмапу с GetPixel()..... слабо верится.....


AF>Там просто слегка оптимизированный вариант memcpy работает.


И всё то вы знаете, даже подозрительно Кто то там кажется вас про MS уже спрашивал


BM>>PS: Мда.... деньги конечно вещь хорошая......


AF>Особенно когда их много.
Re[14]: Медленный BitBlt
От: Alex Fedotov США  
Дата: 19.08.02 17:51
Оценка:
Здравствуйте BugMan, Вы писали:

AF>>Там просто слегка оптимизированный вариант memcpy работает.


BM>И всё то вы знаете, даже подозрительно Кто то там кажется вас про MS уже спрашивал


Просто когда ходишь рядом в отладчике, интересные имена функций попадаются, типа win32k!vFastAlignedCopy. Наводит на мысли.
-- Alex Fedotov
Re[15]: Медленный BitBlt
От: Гришин Сергей Россия  
Дата: 20.08.02 05:20
Оценка:
Alex Fedotov, вопрос :

Объясни тупому, почему GetDiBist из 1024х768х32 в 1024х768х32 выполняется 0.5 секунды, а 1024х768х32 в 1024х768х8 0.15 секунды ?
Re[16]: Медленный BitBlt
От: Alex Fedotov США  
Дата: 20.08.02 05:45
Оценка:
Здравствуйте Гришин Сергей, Вы писали:

ГС>Объясни тупому, почему GetDiBist из 1024х768х32 в 1024х768х32 выполняется 0.5 секунды, а 1024х768х32 в 1024х768х8 0.15 секунды ?


А оно действительно так выполняется? Я могу придумать несколько правдоподобных объяснений, но сначала хотелось бы убедиться, что это действительно так. Кстати, GetDIBits делается с экрана в память или из памяти в память?
-- Alex Fedotov
Re[17]: Медленный BitBlt
От: Алексей Петров Россия  
Дата: 20.08.02 06:10
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Здравствуйте Гришин Сергей, Вы писали:


ГС>>Объясни тупому, почему GetDiBist из 1024х768х32 в 1024х768х32 выполняется 0.5 секунды, а 1024х768х32 в 1024х768х8 0.15 секунды ?


AF>А оно действительно так выполняется? Я могу придумать несколько правдоподобных объяснений, но сначала хотелось бы убедиться, что это действительно так. Кстати, GetDIBits делается с экрана в память или из памяти в память?


Очень похоже:
У меня на некоторых машинах 1024х768х8 с экрана в память снималось ~0,8 сек, а 1024х768х32 — ~0,2 сек.

Так что рассказывай "правдоподобные объяснения".
Re[17]: Медленный BitBlt
От: Гришин Сергей Россия  
Дата: 20.08.02 06:19
Оценка:
AF>А оно действительно так выполняется? Я могу придумать несколько правдоподобных объяснений, но сначала хотелось бы убедиться, что это действительно так. Кстати, GetDIBits делается с экрана в память или из памяти в память?

Чистая правда. Копирование из экрана сразу в DIB секцию битмапа.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.