Hi zusammen,
ich hatte schon in der Vergangenheit festgestellt, daß "blitten" nur bei kleinen Größen wirklich schnell ist.
Bei Größen von z.B. 1680x1050 in 32Bit Farbtiefe dauert ein BitBlt() ca. 100ms. Wie es aussieht, wohl relativ unabhängig von der Rechnerperformance mal bissl mehr, mal weniger.
Nun die Frage an die OpenGl/D3D-Spezialisten:
Gegeben folgendes Szenario:
Veränderungen auf dem Desktop sollen detektiert und "irgendwie" ausgelesen werden. Zur Zeit ist das so gelöst, daß der Desktop in einen Speicherbereich "geblittet" wird und dort mit dem aktuellen Desktopinhalt verglichen wird.
Der Vergleich incl. Feststellen der veränderten Pixel incl. Komprimierung wird per ASM-code erledigt und dauert ca 1ms. Das "Blitten" vom Grafik- in den Hauptspeicher dauert aber 100ms. Das ist für Sprenger120´s "DeskStream" viel zu langsam, da so nur maximal 10FPS erreicht werden können, mehr gibt der Server aufgrund des langsamen Blittens nicht her.
Gibt es eine Möglichkeit per OpenGl/D3D (oder anderem Verfahren) schneller an die unterschiedlichen Pixel von 2 aufeinanderfolgenden Frames auf dem Desktop zu kommen? Das Format wäre erstmal egal, wichtig wäre nur, diese Daten schnellstmöglich in den HAUPTSPEICHER zu bekommen, um sie dann per TCP zu versenden.
/EDIT/ Das eigentliche Blitten geht bissl schneller, aber das "schöne" Blitten mittels SetStretchBltMode(0) dauert ziemlich lange.
/EDIT2/ Ich wiederufe alles und behaupte das Gegenteil! Solange nicht gleichzeitig massive Speicherbewegungen stattfinden (bzw "Action" auf dem Bus ist) ist Blitten sehr schnell!
StretchBlt() ist dagegen, vor allem noch im "schönen" Modus, schnarchlangsam^^, siehe Beispielscript
Spoiler anzeigen
#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$ibreite = @DesktopWidth
$ihoehe = @DesktopHeight
Global $fps
$hDesktopDC = _WinAPI_GetDC(0) ;dc desktop
AdlibRegister("_fps",1000)
[/autoit] [autoit][/autoit] [autoit]$hgui=guicreate("",1000,800)
$hguiDC=_WinAPI_GetDC($hgui)
guisetstate()
;$Ret = DllCall("gdi32.dll", "int", "SetStretchBltMode", "dword", $hguiDC, "int", 4)
While 1;GUIGetMsg()<>-3
;_WinAPI_StretchBlt($hguiDC, 0, 0, 1000,800, $hDesktopDC, 0, 0,@DesktopWidth,@DesktopHeight,0x00CC0020); $SRCCOPY
_WinAPI_BitBlt($hguiDC, 0, 0, $ibreite, $ihoehe, $hDesktopDC, 0, 0,0x00CC0020); $SRCCOPY
$fps += 1
WEnd
Func _fps()
ToolTip("FPS=" & $fps)
$fps = 0
EndFunc ;==>_fps
Func _WinAPI_StretchBlt($hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop)
[/autoit] [autoit][/autoit] [autoit]Local $Ret = DllCall('gdi32.dll', 'int', 'StretchBlt', 'hwnd', $hDestDC, 'int', $iXDest, 'int', $iYDest, 'int', $iWidthDest, 'int', $iHeightDest, 'hwnd', $hSrcDC, 'int', $iXSrc, 'int', $iYSrc, 'int', $iWidthSrc, 'int', $iHeightSrc, 'dword', $iRop)
[/autoit] [autoit][/autoit] [autoit]If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_WinAPI_StretchBlt