2015-08-13 10 views
5

Durch einen Videofilter zu schreiben, das Bild/Frame-Daten in System verarbeitet (nicht Video) Speicher, 2D-Grafik macht sollte, sein Cross-Plattform (mindestens Windows, Linux & OSX) und arbeite sehr schnell, ich schaute über verschiedene Renderer, wie Cairo, AGG und viele andere Projekte. Ich würde keine GPU-Anforderung bevorzugen, daher lag mein Fokus bisher auf dem Rendering von Software.Echtzeit 2D in den Systemspeicher Rendering

Bedauerlicherweise Kairo könnte sehr langsam werden auf komplexe Pfade & Steigungen und erzeugt hässliche Geometrie Störungen durch kleine Pfadsegmente, AGG langsam war auch wegen Optimierungen fehlen, die von den Benutzern viel Arbeit erfordert, andere Projekte nur gerendert zu Windows oder Performance war für sie nicht wichtig. Blend2D machte mich neugierig, aber braucht seine Zeit, um erwachsen zu werden.

Jetzt frage ich mich: sollte ich nur zu einem OpenGL Framebuffer rendern und die 2D-zu-3D-Sachen durch eine Geometrie-Bibliothek tun, die Herausforderung, einen Software-Renderer von Grund auf neu zu entwickeln (beschleunigt durch SIMD, Thread-Pipeline usw.) oder habe ich eine Bibliothek vermisst, die zu mir passt?

Drängt alles Grafik auf GPU immer wegen der billigen Datenübertragung zu & von Videospeicher in diesen Tagen, auch mit 1080p oder größeren Bildern wert?

+0

Vielen Dank für die Erwähnung von Blend2D, es gibt nicht viele Menschen, die dieses Projekt kennen. Es wird 3-10 mal schnelleres softwarebasiertes Rendering im Vergleich zu Cairo/Qt bieten. – Petr

Antwort

1

Alternative zu OpenCV könnte SDL sein. Es gibt zumindest eine Anleitung und Dokumentation, die speziell über streaming video data to the hardware spricht. Natürlich müssen Sie Ihren Filter in Glsl umschreiben, um eine ordentliche Beschleunigung zu erhalten.

Das klingt, als ob Ihr Problem mehr von einer GPU-Computing-Lösung wie OpenCL oder Cuda profitieren könnte. In diesem Fall gibt es kein Rendering, stattdessen senden Sie Ihre Daten an einen GPU-Kernel und holen ihn bei der Verarbeitung zurück. Oder es kann an OpenGL/DirectX (der Videospeicher kann als Textur ganz einfach ohne Leistungsverlust wiederverwendet werden) zum Rendern gesendet werden. Wenn Sie nicht daran interessiert sind, über OpenGL API hinauszugehen, können Sie auch einen Compute-Shader verwenden. Funktioniert wie ein herkömmlicher Shader, außer dass er in einem Durchgang berechnet wird, jedoch mit einigen zusätzlichen Einschränkungen und Einschränkungen.

1

Eine typische Desktop-CPU verfügt über 4 Prozessorkerne mit 2,5 GHz. A modern desktop GPU (circa 2010) hat 48 bis 480 Shader mit 1,4 GHz. In Bezug auf die rohe Verarbeitungsleistung kann die GPU Grafiken 7 bis 70 mal schneller als die CPU verarbeiten.

Wie bei der Übertragungsbandbreite beträgt ein 1080p-Bild 1920x1080 Pixel, die Bildrate 30 Frames pro Sekunde und ein Pixel 4 Byte (32 Bit). Somit ist die gesamte Bus-Bandbreite für Echtzeit-1080p-Verarbeitung erforderlich ist

1920 x 1080 x 30 x 4 = 248 MB/s 

Die Bandbreite eines PCI Express 2.0 x16 Slot ist 8000 MB/s. Das heißt, dass die Übertragungsrate von CPU zu GPU kein Problem ist.

Also, um Ihre Frage zu beantworten: Ja, pushen alles Grafik auf der GPU ist immer es wert, auch mit 1080p oder größer Bilder.

+0

Danke, das beantwortet schon meinen letzten Satz. Ich möchte immer noch offline machen (vielleicht mit einem Software & Hardware Backend), könntest du etwas mehr zu meiner allgemeinen Frage hinzufügen? – Youka

0

Haben Sie versucht OpenCV?

Es bietet sowohl die Software als auch den Hardware-Renderer mit den huge library hochoptimierten Funktionen für die Echtzeit-Bildverarbeitung und Rendering.

+0

OpenCV ist eher für Operationen über das gesamte Bild, wie Analysen, Nachbearbeitung, Aufzeichnung usw. Andere Dinge sind Spielzeug, einschließlich der Zeichenfunktionen und OpenGL-Wrapper. Für ernsthafte 2D-Rendering hat Kairo einen besseren Job gemacht. Außerdem ist es eine große Abhängigkeit für einen "kleinen" Videofilter am Ende. – Youka