Capture-Bildschirm mit DirectX
Ich weiß, wie Sie GDI-capture-Bildschirm, jedoch ist es sehr langsam (es kaum erfasst 10 fps)
Ich habe gelesen, dass DirectX bietet die beste Geschwindigkeit. Aber bevor ich anfange zu lernen, DirectX ich wollte, eine Probe zu testen, um zu sehen, ob es wirklich so schnell ist.
Ich habe festgestellt, dass dies Frage , bietet ein Beispiel-code dazu:
void dump_buffer()
{
IDirect3DSurface9* pRenderTarget=NULL;
IDirect3DSurface9* pDestTarget=NULL;
const char file[] = "Pickture.bmp";
//sanity checks.
if (Device == NULL)
return;
//get the render target surface.
HRESULT hr = Device->GetRenderTarget(0, &pRenderTarget);
//get the current adapter display mode.
//hr = pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddisplaymode);
//create a destination surface.
hr = Device->CreateOffscreenPlainSurface(DisplayMde.Width,
DisplayMde.Height,
DisplayMde.Format,
D3DPOOL_SYSTEMMEM,
&pDestTarget,
NULL);
//copy the render target to the destination surface.
hr = Device->GetRenderTargetData(pRenderTarget, pDestTarget);
//save its contents to a bitmap file.
hr = D3DXSaveSurfaceToFile(file,
D3DXIFF_BMP,
pDestTarget,
NULL,
NULL);
//clean up.
pRenderTarget->Release();
pDestTarget->Release();
}
Habe ich versucht, die erforderlichen Dateien. Aber nicht alle von Ihnen aufgenommen werden können (zum Beispiel #include <D3dx9tex.h>
).
Kann mir jemand eine gute Beispiel, der hat alle erforderlichen enthält, oder zeigen Sie mir, was Bibliotheken, die ich installieren sollte.
Ich benutze Visual C++ 2010 Express unter Windows 7 Ultimate (x64).
Edit:
Auch dieser code ist nicht vollständig, zum Beispiel, was ist die Device
identifier?!
#include <D3D9.h>
muss ich eine ältere version von DirectX SDK installiert oder so?Ich habe versucht, verschiedene Methoden der screen-capturing-einschließlich DirectX, während DirectX eine schneller war als andere, die es nicht zu erheblichen speedup (zur Deckung der zusätzlichen Komplexität und Zeitaufwand). Sorry, ich erinnere mich an keine details oder zahlen.
T Wie viele screenshots waren Sie in der Lage zu erfassen in 1 Sekunde?
Ich hatte Recht geringe Anforderungen, so etwas wie 10fps, es ist genug für desktop-capturing, aber nicht für Spiele - /video-capturing
Möchten Sie für die Unterstützung von Windows 7 als Zielplattform?
InformationsquelleAutor | 2015-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist hier einige Beispiel-code auf dem Bildschirm erfassen mit DirectX 9.
Sie sollten sich nicht installieren-SDK (mit Ausnahme der standard-Dateien, die mit Visual Studio, obwohl ich es nicht getestet, VS 2010).
Einfach erstellen Sie eine einfache Win32-Konsolen-Anwendung, fügen Sie den folgenden in der stdafx.h-Datei:
Hier ist die Probe Hauptprobleme bei der Umsetzung
Was wird dies tun, ist die capture 10 mal den Bildschirm, und speichern Sie "cap%ich.png" Bilder auf der Festplatte. Es zeigt auch die Zeit für diese genommen (speichern von Bildern wird nicht gezählt in dieser Zeit nur von screenshots).
Auf meinem (desktop-windows 8 - Dell Precision M2800/i7-4810MQ-2,80 GHz/Intel HD 4600, die ist ziemlich beschissen Maschine...) Maschine, dauert es 100 1920x1080 fängt in ~4sec, so um die 20/25 fps.
Hinweis: dieser code implizit links zu WIC (imaging library im Lieferumfang von Windows für eine Weile jetzt) zum speichern der image-Dateien (so brauchen Sie nicht, die berühmten D3DXSaveSurfaceToFile, die erfordern, dass alte DirectX-SDKs installiert werden):
Und einige Makros, die ich verwendet habe:
Hinweis: für Windows 8 - + - clients, alle diese (außer WIC) sollten fallen gelassen werden zu Gunsten der Desktop-Duplikation API.
eine weitere Frage
posted. Danke. Bitte stackoverflow.com/questions/33753912/...
kann ich diese mit einem DX11-Spiel?
Dieser code ist groß, aber wenn ich den Schalter auf Vollbild-directx Anwendung es nimmt einen Screenshot des Bildschirms, wenn ich switch und ständig das gleiche Bild immer und immer wieder. Irgendwelche Ratschläge?
InformationsquelleAutor Simon Mourier
Haben Sie nicht gesagt, die Anforderungen für die Ziel-Windows-Versionen. Wenn Sie nicht brauchen, um Unterstützung für Windows 7, Windows 8 enthält eine schöne neue DXGI-Schnittstelle IDXGIOutputDuplication erlaubt, erstellen Sie ein COM-Objekt, das dupliziert die Ausgabe eines video-adapter und bietet CPU den Zugriff auf den video-Speicher durch IDXGIOutputDuplication::MapDesktopSurface. MSDN hat ganz schön Probe das fängt den desktop über dieses und zieht es in eine form und funktioniert einwandfrei. Also wenn Windows 7 nicht, ein muss, würde ich vorschlagen, Sie schauen sich das an.
das ist nur meine subjektive Meinung, aber ich bezweifle, dass Sie werde in der Lage sein, dies zu tun auf XP in anderer Weise als die GDI langsam ist:(
InformationsquelleAutor Rudolfs Bundulis
Können Sie die DirectX SDK von microsoft.com/en-ca/download/details.aspx?id=6812 (gepostet von @yms). Dieses SDK ist kompatibel mit allen Versionen von Windows, einschließlich XP. Finden Sie in der zugehörigen Dokumentation darüber, wie man include/link mit D3D9.
In deinem Beispiel
Device
ist einIDirect3DDevice9
. Jeder D3D9-Anwendung erstellen müssen, einer von Ihnen. Es ist sehr leicht zu finden, Beispiel-code auf, wie Sie einen erstellen (zB. https://msdn.microsoft.com/en-us/library/windows/desktop/bb204867%28v=vs.85%29.aspx).In deinem Beispiel-code, nur der Inhalt gerendert wird, im DirectX-Aufnahme, die ich annehmen, ist nicht Ihre Absicht. Um den gesamten Bildschirm erfassen (die ich nehme an, das ist das Ziel), anstatt
IDirect3DDevice9::GetRenderTarget
verwenden, sollten SieIDirect3DDevice9::GetFrontBufferData
wie in diesem tutorial (http://dim-i.net/2008/01/29/taking-screenshots-with-directx-and-dev-cpp/). Wenn Sie auf der Suche nach Geschwindigkeit, sollten Sie nicht erstellen Sie die offscreen-Oberfläche jeden Rahmen, als in deinem Beispiel und diesem tutorial. Der Speicher-pool-sollteD3DPOOL_SYSTEMMEM
in diesem Fall nichtD3DPOOL_SCRATCH
. Abhängig von der Größe des Bildschirms, die wahrscheinlich Engpass sein wird, das schreiben der Bilder auf die Festplatte.Beachten Sie auch, dass der Bildschirm erfasst haben, werden diese für den adapter verwendet um die
IDirect3DDevice9
. Dies ist der erste parameterIDirect3D9::CreateDevice
. Dies ist nur eine Sorge, wenn die Erfassung mehrerer Monitore ist eine Möglichkeit.InformationsquelleAutor MuertoExcobito