DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von Hoto »

Eine Idee hätte ich noch, aber ob das funktioniert?

Statt das die DLL das Bild übergibt, könnte sie ja auch nur die Adresse des Speicherbereichs der Textur im Grafikspeicher an PB übergeben und dann greift PB per DX11 Subsystem darauf zu, wodurch PB selbst die Texture im Grafikspeicher verkleinern könnte. Aber ob so etwas überhaupt möglich ist?
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von Hoto »

Bin ich doch noch über eine Idee gestolpert, die ganz gut aussieht (zusammen kopiert, rein zum Funktionsverständnis).

Code: Alles auswählen

*buf2 = AllocateMemory(Width*Height*4)
CreateImage(0,Width,Height,32)
StartDrawing(ImageOutput(0))
  *buf2 = DrawingBuffer()
  Get_Frame_Bytes(*dxgi_manager, @buf_size, @*buf)
  CopyMemory(*buf,*buf2,buf_size)
StopDrawing()
Hatte erst versucht Get_Frame_Bytes() direkt in den DrawingBuffer() schreiben zu lassen, aber das schein wohl nicht zu gehen, kriege ich bloß ein schwarzes Bild raus. Oder geht das doch irgendwie?

So klappt es aber, auch wenn das Bild auf dem Kopf steht (vertikal gespiegelt), was aber für die Weiterverarbeitung völlig egal ist, zumindest in meinem Fall, da das Bild ja nicht zum anzeigen gedacht ist. Ich hatte eigentlich mit falschen Farben gerechnet, weil ich BGRA Farbreihenfolge, aber PB arbeitet wohl intern mit der gleichen Reihenfolge.

Dennoch wüsste ich gerne wie viel ms man sparen könnte, könnte ich die Daten schon im Grafikspeicher reduzieren.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von Mijikai »

Vielleicht hilfreich :)

Farbwerte auslesen (schneller als einzelne PeekA()):

Code: Alles auswählen

Global *Pixel.Long
Global Pitch.i

Pitch = Width * 4
*Pixel = *Buffer + (Y * Pitch) + X * 4
Plot(X,Y,*Pixel\l)
Farbwerte Auslesen & Auflösung reduzieren:

Code: Alles auswählen

;StepX & Y -> Faktor Skalierung
For X = 0 to Width step StepX
  For Y = 0 to Width step StepY
    Plot(X / StepX,Y / StepY)
  Next
Next
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Re: DXGI Desktop Duplication API (DX11 Win8+) Hilfe gesucht

Beitrag von Hoto »

Zweites hatte ich schon, aber Plot in einer For Next Schleife ist einfach viel zu langsam. Da ist die letzte Lösung oben aktuell doch die Beste, also einfach den Empfangs Buffer direkt in den Image Buffer kopieren, direkt die Daten in den Image Buffer schreiben zu lassen scheint ja leider nicht zu gehen (würde noch mal 2-3ms sparen) oder ich hab da ein Fehler übersehen.

Wenn ich dann die Farben von dem bereits verkleinerten Bild brauche, werd ich wohl wieder direkt den Image Buffer nehmen und den auslesen. Da werd ich dann aber eh die verschiedensten Möglichkeiten durch gehen und schauen was am schnellsten geht.
Antworten