![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как ускорить снятие скриншота, Ассемблерная вставка
Вова © (2013-08-14 16:21:00)Обнаружил я такой вот код.
Питаю надежду, что он будет работать быстрей моего.
http://www.programmersforum.ru/showthread.php?t=35588
asm
push esi
push edx
mov ecx, BufLength // размер массива (Integer)
mov esi, PointerBuf1Scr // указатель на источник (Pointer)
mov edx, PointerBuf2Scr // указатель на приемник (Pointer)
@@mix:
movq xmm0, [esi] // buf1 -> в регистр
movq [edx], xmm0 // buf2 <- из регистра
add esi, 8
add edx, 8
loop @@mix
pop edx
pop esi
emms
end;
Естественно ничего из написаного мне не понятно. Но исходя из контекста у меня возникло ощущение, что это можно использовать для снятия скриншота. Только вот как это должно выглядеть на делфи я не знаю. В общем то в этом и вопрос.
Procedure TMyObject.getScreen(var tbmp: Tbitmap; tmpCoord: TCoord);
var
hDC1: HDC;
R: TRect;
Canvas: TCanvas;
begin
if tmpCoord.x2search = 0 then
tmpCoord.x2search := screen.Width;
if tmpCoord.y2search = 0 then
tmpCoord.y2search := screen.Height;
hDC1 := GetDC(0);
Canvas := TCanvas.Create();
Canvas.Lock;
Canvas.Handle := hDC1;
R := Rect(tmpCoord.x1search, tmpCoord.y1search, tmpCoord.x2search,
tmpCoord.y2search);
tbmp := Tbitmap.Create;
tbmp.Canvas.Lock;
tbmp.Width := R.Right - R.Left;
tbmp.Height := R.Bottom - R.Top;
tbmp.PixelFormat := pf24bit;
tbmp.Canvas.CopyRect(Rect(0,0,tbmp.Width,tbmp.Height), Canvas, R);
ReleaseDC(0, hDC1);
Canvas.Free;
Canvas.Unlock;
end;
как то так делался у меня скриншот, ну примерно в общем не суть, как это объединить?
Вова (2013-08-14 16:26:00) [101]Procedure Copy(BufLength:Integer; PointerBuf1Scr:Pointer; PointerBuf2Scr : Pointer);
begin
asm
push esi
push edx
mov ecx, BufLength // размер массива (Integer)
mov esi, PointerBuf1Scr // указатель на источник (Pointer)
mov edx, PointerBuf2Scr // указатель на приемник (Pointer)
@@mix:
movq xmm0, [esi] // buf1 -> в регистр
movq [edx], xmm0 // buf2 <- из регистра
add esi, 8
add edx, 8
loop @@mix
pop edx
pop esi
emms
end;
End;
Но что есть указатели?