![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Быстрый скриншот [WinXP]
XProger © (2007-05-02 01:46:00)Необходимо за минимальное время получить весь RGB массив данных текущего состояния экрана.
GetDiBits при моих условиях даёт порядка 24 мс, что неприемлимо :(
Какие помимо этого существуют методы?
XProger (2007-05-07 17:07:00) [1]Sapersky, спасибо за информацию, выделение памяти это пережитки GetDiBits :)
Sapersky (2007-05-07 15:04:00) [2]XProger © (05.05.07 06:52) [9]
GetMem(Bits, ScrSize); - вот этого не надо, CreateDIBSection сама выделяет память.
Ещё у меня на Win98 не хотело работать, пока не поставил
biSize := SizeOf(BIH.header); // 40 байт, а SizeOf(BIH) - 44
но можно ли быстрее не прибегая к DX
По моим тестам DX (DirectDraw) в данном случае никакого эффекта не даёт. Скорость такая же, что и с CreateDIBSection/BitBlt.
XProger (2007-05-05 17:29:00) [3]DVM, 150 мс +/- 20 мс точности, не так страшно... причём для 100 скриншотов эта цифра в 15 мс практически не изменяется.
DVM (2007-05-05 15:52:00) [4]GetTickCount не очень точно, для таких малых интервалов, лучше QueryPerformanceCounter
XProger (2007-05-05 06:52:00) [5]
program ScreenShot;
uses
Windows, SysUtils;
{$APPTYPE CONSOLE}
type
TScr = array [0..1] of Byte;
PScr = ^TScr;
var
hBmp : hBitmap;
DeskDC : hDC;
DC : hDC;
BFH : tagBITMAPFILEHEADER;
BIH : tagBITMAPINFO;
ScrX, ScrY : Integer;
F : File;
ScrSize : Cardinal;
Bits : Pointer;
t : LongWord;
i : Integer;
begin
DeskDC := GetDC(0);
ScrX := GetDeviceCaps(DeskDC, HORZRES);
ScrY := GetDeviceCaps(DeskDC, VERTRES);
ScrSize := ScrX * ScrY * 4;
with BFH do
begin
bfType := $4D42;
bfSize := ScrSize + SizeOf(BFH) + SizeOf(BIH);
bfReserved1 := 0;
bfReserved2 := 0;
bfOffBits := SizeOf(BFH) + SizeOf(BIH);
end;
with BIH.bmiHeader do
begin
biSize := SizeOf(BIH);
biWidth := SCRX;
biHeight := SCRY;
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
biSizeImage := ScrSize;
biClrImportant := 0;
end;
GetMem(Bits, ScrSize);
hBmp := CreateDIBSection(DeskDC, BIH, DIB_RGB_COLORS, Bits, 0, 0);
DC := CreateCompatibleDC(DeskDC);
SelectObject(DC, hBmp);
t := GetTickCount;
for i := 0 to 9 do
begin
BitBlt(DC, 0, 0, ScrX, ScrY, DeskDC, 0, 0, SRCCOPY);
{
AssignFile(F, 'src' + IntToStr(i) + '.bmp');
Rewrite(F, 1);
Blockwrite(F, BFH, SizeOf(BFH));
Blockwrite(F, BIH, SizeOf(BIH));
Blockwrite(F, bits^, ScrSize);
CloseFile(F);
}
end;
writeln((GetTickCount - t)/10:2:2);
readln;
DeleteObject(hbmp);
FreeMem(Bits);
end.
XProger (2007-05-05 06:48:00) [6]CreateDIBSection + BitBlt даёт 15 мс. Уже лучше, но можно ли быстрее не прибегая к DX или "самописным драйверам"? :)
homm (2007-05-05 05:31:00) [7]> А как же аппаратная независимость GDI?
Ну вот и независимость в том и есть, что ты до апаратной части добраться не сможешь. Это же не указатель на видеопамять, а контекст этого указателя. Что-бы получить указатель на данные этого контеста, в любом случае нужена передача данных в ОП. Посмоти реализацию TBitmap.ScanLines в VCL.
XProger (2007-05-04 23:22:00) [8]homm, неужели? А как же аппаратная независимость GDI? )
homm (2007-05-04 20:06:00) [9]> года 3 назад как-то делал указатель на данные контекста,
> вспомнить вот не могу :)
И не вспомнишь, т.к. контекст этот области в памяти видеодкарты.
XProger (2007-05-04 17:56:00) [10]homm,
Мне нужно периодически получать массив данных пригодный для постобработки и хранения в файле :)
Sapersky, BitBlt сбрасывает на контекст... года 3 назад как-то делал указатель на данные контекста, вспомнить вот не могу :)
За книжку огромное спасибо, думаю найду в ней массу полезного!
Sapersky (2007-05-04 13:28:00) [11]Может, BitBlt будет побыстрее, особенно если установить формат буфера = формату рабочего стола, но вряд ли намного.
Относительно драйверов см. Фень Юаня:
http://irazin.ru/Downloads/Books/Yuan.rar
homm (2007-05-04 07:13:00) [12]> GetDiBits при моих условиях даёт порядка 24 мс, что неприемлимо :(
А тебе точно DIB нужен? Если можно обойтись DDB, время снижаеться милиисекунд до 5-и наверное :)
DVM (2007-05-02 10:49:00) [13]
> Какие помимо этого существуют методы?
Драйвер свой. Как у Remote Administartor. Подробнее к сожалению не знаю.