Unsicher pro Pixelzugriff, 30ms Zugriff für 1756000 Pixel

7

So habe ich auf meiner Website einige Gedanken zum Thema des obigen Themas zum schnellen, unsicheren Pixelzugriff geäußert. Ein Gentleman gab mir ein grobes Beispiel, wie er es in C ++ machen würde, aber das hilft mir nicht in C #, es sei denn ich kann es interoperieren, und die Interop ist auch schnell. Ich hatte eine Klasse im Internet gefunden, die mit MSDN-Hilfe geschrieben wurde, um Pixel unsicher zu bekommen. Die Klasse ist außergewöhnlich schnell, aber nicht schnell genug. Hier ist die Klasse:

%Vor%

}

Im Grunde kopiere ich den gesamten Bildschirm und vergleiche jedes Pixel mit einer alten Kopie. Bei einer 1680x1050-Bitmap dauert dies etwa 300 Millisekunden mit dem folgenden Code.

%Vor%

Gibt es eine mögliche Methode / Methode, mit der ich diese Geschwindigkeit auf ungefähr 30 ms beschleunigen könnte? Ich kann den Bildschirm in ca. 30ms mit Graphics.CopyFromScreen () kopieren, so dass ungefähr 30 Bilder pro Sekunde erzeugt werden. Ein Programm läuft jedoch nur so schnell wie sein langsameres Gegenstück, sodass die Verzögerung von 300 ms in GetInvalidFrame dies auf etwa 1-3 Frames pro Sekunde verlangsamt. Dies ist nicht gut für eine Meeting-Software.

Irgendwelche Ratschläge, Annäherungen, Hinweise in die richtige Richtung wären absolut wundervoll! Außerdem ist der Code, der zum Zeichnen der Bitmap auf der Clientseite verwendet wird, ebenfalls unten.

Dmitriys Antwort / Kommentar kommentieren:

%Vor%     
David Anderson - DCOM 21.05.2009, 14:42
quelle

5 Antworten

15

Unsicherer Ansatz mit Verwendung von Ganzzahlen anstelle von Pixeln und Einzelschleife:

%Vor%

Ich denke, dass Sie wirklich XORed Rahmen hier verwenden können und ich hoffe, dass das auf beiden Seiten bessere Leistung haben kann.

%Vor%

Sie können diese Prozedur auf beiden Seiten folgendermaßen verwenden:
Auf der Server-Seite müssen Sie den Unterschied zwischen altem und neuem Frame bewerten, es an den Client senden und den alten Frame durch den neuen ersetzen. Der Servercode sollte etwa so aussehen:

%Vor%

Auf der Client-Seite müssen Sie Ihren aktuellen Frame mit dem vom Server empfangenen Xoder Frame aktualisieren:

%Vor%     
okutane 22.05.2009, 15:34
quelle
3

Hier: Unter Verwendung der GPU mit c # werden einige Librarys zur Verwendung erwähnt die GPU von C #.

    
Allan Simonsen 21.05.2009 14:55
quelle
3

Ja, Sie können dies tun, indem Sie unsafe code verwenden.

%Vor%

Sehen Sie sich Ссылка für einige grundlegende Beispiele dieser Art von Sachen an. Mein Code basiert darauf.

Hinweis: Einer der Gründe dafür, dass dies viel schneller ist als bei Ihnen, besteht darin, dass Sie jeden Kanal separat vergleichen, anstatt nur das gesamte Byte mit einer Operation zu vergleichen. In ähnlicher Weise würde das Ändern von PixelAt, um Ihnen ein Byte zu geben, um dies zu erleichtern, wahrscheinlich eine Verbesserung bringen.

    
Brian 21.05.2009 14:48
quelle
1

Anstatt jedes Pixel zu überprüfen, können Sie einfach einen grundlegenden Speichervergleich der 2 Bitmaps durchführen. In C etwas wie memcmp ().

Dies würde Ihnen einen viel schnelleren Test geben, um Sie wissen zu lassen, dass die Bilder gleich sind oder nicht. Nur wenn Sie wissen, dass sie anders sind, müssen Sie auf den teureren Code zurückgreifen, der Ihnen hilft festzustellen, wo sie sich unterscheiden (falls Sie das überhaupt wissen sollten).

Ich bin jedoch keine C # Person, also weiß ich nicht, wie einfach es ist, Zugang zum rohen Speicher zu bekommen.

    
Rik Heywood 21.05.2009 14:49
quelle
0

konnte ca. 60ms abschneiden. Ich denke, das wird die GPU erfordern. Ich sehe keine Lösung dafür, die CPU zu nutzen, selbst wenn ich mehr als ein Byte / Pixel gleichzeitig vergleiche, es sei denn, jemand kann ein Codebeispiel erstellen, um mir etwas anderes zu zeigen. Immer noch bei ungefähr 200-260ms, viel zu langsam für 30fps.

%Vor%     
David Anderson - DCOM 22.05.2009 07:57
quelle

Tags und Links