Schnellste Methode der screen-capturing unter Windows

Möchte ich mal ein screencasting-Programm für die Windows-Plattform, aber bin unsicher, wie auf dem Bildschirm erfassen. Die einzige Methode, die ich bewusst bin, ist die Nutzung von GDI, aber ich bin neugierig, ob es gibt andere Wege zu gehen über diese, und, wenn ja, welche verursacht am wenigsten Aufwand? Geschwindigkeit ist eine Priorität.

Den screencasting-Programm wird für Aufnahme-game footage, obwohl, falls dies nicht der verengen die Optionen, die ich bin immer noch offen für andere Vorschläge, fallen aus diesem Rahmen. Wissen ist nicht schlimm, nachdem alle.

Bearbeiten: ich stieß auf diesen Artikel: Verschiedene Methoden für die Erfassung der Bildschirm. Es hat mir den Windows-Media-API Weg, es zu tun, und der DirectX-Weg, es zu tun. Es wird in der Schlussfolgerung, dass das deaktivieren der hardware-Beschleunigung könnte drastisch verbessern die Leistung des capture-Anwendung. Ich bin neugierig, warum das so ist. Könnte jemand füllen Sie die Leerzeichen aus für mich?

Bearbeiten: ich habe gelesen, dass screencasting-Programme wie Camtasia verwenden Sie Ihre eigenen capture-Treiber. Könnte mir jemand eine genauere Erklärung, wie es funktioniert, und warum es schneller ist? Ich kann auch brauchen Führung auf die Umsetzung von sowas, aber ich bin sicher, es gibt die vorhandene Dokumentation sowieso.

Auch, ich weiß jetzt, wie FRAPS zeichnet die Bildschirm. Sie hakt sich die zugrunde liegende Grafik-API zum Lesen aus dem Puffer zurück. Von dem, was ich verstehe, ist dies schneller als das Lesen aus dem front-buffer, denn Sie sind das Lesen von system-RAM, sondern als video-RAM. Sie können den Artikel Lesen hier.

  • Haben Sie sich überlegt, anstatt grafisch Aufnahme der Inhalt des Bildschirms, mit einem replay-system?
  • Das war eine interessante Lektüre, aber ich glaube nicht, dass es funktionieren würde. Ich müsste irgendwie Haken die Ereignisse, was nicht möglich ist mit einem "generic application", und es klingt wie ich tun müsste, wäre, ein bisschen von hacking. Gleiches gilt für die Darstellung.
  • Sie haben keine Haken nichts. Sie müssen nur geben Sie Ihre Eingabe-Ereignisse, so dass Sie keine Kontrolle über das Spiel direkt, sondern andere Funktionen aufrufen. Zum Beispiel, wenn der Spieler drückt die linke Taste, die Sie nicht einfach verringern Sie den Spieler x-position. Stattdessen werden Sie eine Funktion aufrufen, wie MovePlayerLeft(). Und Sie zeichnen auch den Zeitpunkt und die Dauer der Tastendrücke und anderen input. Dann, wenn Sie im Wiedergabe-Modus, können Sie einfach ignorieren Sie den Eingang, und stattdessen Lesen Sie die aufgezeichneten Daten. Wenn die Daten, die Sie sehen, eine Links-Taste drücken, rufen Sie MovePlayerLeft().
  • Dies wird eine Allgemeine Anwendung für die Aufzeichnung von game footage. Es ist nicht für ein bestimmtes Spiel. Jemand drücken der linken Taste könnte bedeuten, verschieben Sie das richtige, für alle, die ich kenne. Auch, Sie nicht als Ereignisse, die nicht beeinflusst durch den Benutzer. "Und was ist rendering?
  • Oh, okay. Ich habe nicht verstanden, dass ein Teil(etwa dadurch, dass ein externer Anwendung). Aber für Veranstaltungen, die nicht beeinflusst durch die Benutzer, die aufgezeichnet werden, zu. Etwas in Ihrem Spiel, das ist nicht deterministisch, müsste aufgezeichnet werden. Und das rendering behandelt werden würde von der Spiel-engine die gleiche, wie wenn jemand spielt. (dies ist, natürlich, nicht auf Ihre situation zutreffen, so verstehe ich es jetzt)
  • Haben Sie getestet, die Leistung CreateOffscreenPlainSurface und GetFrontBufferData im DirectX? Ich kann mir nicht vorstellen, dies könnte langsamer als GDI+.NET, Windows API, oder die anderen verfügbaren Methoden.
  • Ich habe nicht getan, alle tests, aber andere Menschen haben, mit Ergebnissen, die wieder meine Forderung. Außerdem, ich zitiere aus der MSDN-Dokumentation: "Diese Funktion ist sehr langsam, mit design, und sollte nicht verwendet werden in jeder performance-kritischen Weg". Dies ist, weil Sie gelesen haben, von video-RAM, das ist langsam, weil die CPU-GPU-Latenz. .NET API ist einfach ein wrapper für GDI, soweit ich weiß.
  • Ok, ich denke, du machst etwas viel intensiver, habe ich eine routine mit den oben genannten Methoden zu save replay AVIs in einem Spiel bei um die 30fps ohne Probleme. Ich machte eine mehrfach-monitor-Bildschirm-recorder mithilfe der windows-API für "work-force-Optimierung", aber schlecht ausgeführt, auch auf gezielte 4fps.
  • Durch Windows API redest du von GDI? Hmm, das überrascht, dass es derart schlecht im Vergleich zu DirectX ist GetFrontBufferData.
  • ehrlich gesagt, ich denke, die schlechte Leistung, hatte mehr zu tun mit der weiteren Umsetzung im Detail vor allem das streaming der frames von vielen überwachten Maschinen auf einem einzigen windows-Dienst für die Archivierung.
  • sind Sie sicher, dass der WME Zeug ist schneller als GDI? Es ist möglich, Sie nur mit GDI unter...
  • Rückblick auf die codeprojects link, es muss nicht wirklich erwähnen, dass WME ist schneller :/. Ich falsch gelesen, sorry. Wie es mit GDI, ich bin mir nicht mehr sicher.
  • Es ist ein open-source-mirror-Treiber für windows auf UltraVNC repository Seite hier ultravnc.svn.sourceforge.net/viewvc/ultravnc/...
  • Hast schreibst du dein Programm? Ich bin mal gespannt.
  • Ich begann, etwas vor ein paar Jahren, aber es war bei weitem nicht vollständig. Ich hatte nicht das Gefühl, komfortabel schreiben, weil ich das Gefühl hatte, es wurden eine Menge Lücken in meinem wissen, so verlor ich die motivation. Wenn ich jemals Zeit haben, Lesen Sie ein paar Bücher über das Thema, könnte ich etwas anfangen.

InformationsquelleAutor someguy | 2011-02-21
Schreibe einen Kommentar