Heim >Backend-Entwicklung >C#.Net-Tutorial >Kommentieren Sie kurz den Rendering-Algorithmus von Adobes FlashPlayer
Vor einiger Zeit habe ich einen Artikel auf CSDN gesehen, in dem dargelegt wurde, dass die Rendering-Leistung von FlashPlayer um ein Vielfaches höher ist als die von HTML 5. Ich erinnerte mich an die Forschung zu Adobes FlashPlayer in den letzten Jahren und wollte theoretisch untersuchen, warum es so etwas gibt Erklären Sie gleichzeitig auch, warum der Flash Player von Adobe wegen seiner herkömmlichen Hardwarebeschleunigung (Nicht-GPU-Lösungen) kritisiert wurde.
In den Anfangsjahren arbeitete ich in einer IC-Designfirma, um die offizielle Flash Player-Hardware zu entwickeln Eine Low-End-Plattform (mit Hardware-3D-Beschleunigung). Nach ein paar Monaten war die Hardware-Rendering-Engine fertig, aber das Endergebnis war sehr unerwartet ----- Die Leistung nach dem Wechsel zur Hardware-Beschleunigung war tatsächlich schlechter als beim Software-Rendering Um die Gründe zu erläutern, beginnen wir mit dem Rendering-Algorithmus der FlashPlayer-Software, der auf dem Prinzip basiert ist ein virtuelles Anzeigegerät (zur Berücksichtigung von Anti-Aliasing). Wenn das virtuelle Anzeigegerät größer als das tatsächliche Anzeigegerät ist, z. B. 4 x 4 Anti-Aliasing, ist die vertikale Richtung des virtuellen Anzeigegeräts viermal so groß wie die des (tatsächliches Anzeigegerät) Jede Scanlinie berechnet den Schnittpunkt mit jeder Kante (Kante) der Vektorgrafik und füllt auf diese Weise die horizontale Linie zwischen den beiden Schnittpunkten gemäß unterschiedlichen Füllregeln, nachdem die Scanlinien einzeln berechnet wurden Von oben nach unten wird eine vollständige Grafik im virtuellen Anzeigegerät vervollständigt und dann gemäß dem Supersampling-Algorithmus die Grafiken auf dem virtuellen Anzeigegerät auf das tatsächliche Anzeigegerät ausgegeben, sodass eine perfekte Grafik ohne Alias entsteht Wiederholen Sie die oben genannten Aktionen mit einer bestimmten Geschwindigkeit. FlashPlayer analysiert die SWF-Datei und aktualisiert den Bildschirm mit der angegebenen Geschwindigkeit. Daher haben wir einige einfache Schlussfolgerungen:
l Der Vektorbetrieb ist eine riesige Berechnung; dies erklärt auch, warum FlashPlayer auf den meisten Plattformen verwendet wird. Bestehende Leistungsprobleme. Leider scheint die aktuelle Echtzeit-2D-Vektorgrafik-Player-Software nur Flash Player zu haben, daher gibt es keine Möglichkeit, dies zu beanstanden ;
l Warum ist die Anzeigeleistung von hochauflösenden Grafiken viel schlechter als die von Grafiken mit geringerer Qualität? Denn bei hoher Bildqualität verwendet FlashPlayer 4 x 4 Super-Sampling-Anti-Aliasing und berechnet die Schnittpunkte durch Scanlinien ist 4-mal so hoch wie bei niedriger Bildqualität; Nach Berücksichtigung von Cap und Join sind die Probleme oft komplexer. Selbst eine sehr einfache Polylinie oder Bezier-Kurve besteht aus vielen Kurven (wie in der Abbildung als die beiden Endpunkte der Polylinie dargestellt ----Cap):
Auf diese Weise können Sie verstehen, warum es nur wenige Echtzeit-2D-Produkte gibt, die mit dem Adobe FlashPlayer Vector-Anzeigeprogramm konkurrieren können. Ist das nicht ein bisschen widersprüchlich: Warum sticht der Flash Player von Adobe heraus? Das Obige ist nur eine prinzipielle Erklärung der 2D-Vektorgrafikanzeige. Andere 2D-Vektoranzeige-Engines wie OpenVG (gingkoVG), agg usw. verwenden genau das gleiche Prinzip wie der FlashPlayer von Adobe, eine relativ verbreitete 2D-Vektoranzeige-Engine Wenn Sie eine eigene spezielle Definition haben, lesen Sie sorgfältig das offizielle technische Dokument von Adobe zu FlashPlayer (swf_file_format_spec_v10). Wir haben schnell zwei sehr interessante Anweisungen gefunden:
l FlashPlayer unterstützt nur Bezier-Kurven 2. Ordnung (quadratischer Bezier) und unterstützt keine ähnliche Bezier-Kurve 3. Ordnung Bezier-Kurve (kubischer Bezier), die in herkömmlichen 2D-Vektor-Engines wie PostScript und OpenVG verwendet wird.
Im Vergleich zur Beizer-Kurve 2. Ordnung nimmt eine einzelne Bezier-Kurve 3. Ordnung bei der Berechnung von Schnittpunkten zu Der Rechenaufwand scheint nicht groß zu sein: Es gibt mehrere Multiplikationsoperationen, aber in den meisten CPU-Systemen ist der Zeitaufwand für Multiplikations- und Divisionsoperationen größer als der für Additions- und Subtraktionsoperationen , der kumulative Unterschied ist sogar noch größer;
l In den offiziellen Dokumenten von Adobe heißt es eindeutig, dass FlashPlayer Punkt-Strich (Dash) nicht unterstützt.
Warum unterstützt es Dash nicht? Tatsächlich ist es bei der Vektorgrafikanzeige neben der Berechnung des Schnittpunkts der Kurve und der Scanlinie am schwierigsten, die Länge der Kurve zu berechnen. Die Anzeige von Dash muss sich auf die Berechnung der Kurvenlänge stützen im Voraus; bei der Implementierung von gingkoVG ist die Kurve der Dash-Funktion nicht enthalten. Es zeigt, dass die Anzeigeleistung viermal so hoch ist wie bei der Verwendung von Dash
l Ist das alles? Nein, aber trotz der oben genannten Einschränkungen wurde die Anzeigeleistung mehrfach „verbessert“. Im FlashPlayer von Adobe werden andere Optimierungsalgorithmen zum Rendern verwendet. Natürlich werden diese Optimierungsalgorithmen auch in den meisten 2D-Vektor-Engines als allgemeine Optimierungstechniken verwendet >Leider unterstützen die meisten 2D-Vektor-Engines Bezier-Kurven dritter Ordnung, Punkt-Strich-Linien und sogar Bögen (OpenVG), da die Vielseitigkeit für uns nicht schwer zu verstehen ist Diese Open-Source-Flash-Player, die Standard-2D-Rendering-Engines verwenden (z. B. Gnash verwenden AGG), sind mit der Ausführungsleistung von Adobes Flash Player vergleichbar. ----- Weil die 2D-Rendering-Engine von Flash Player auf die Echtzeitanforderungen der Flash-Wiedergabe zugeschnitten ist Darüber hinaus verfügt der Flash Player von Adobe natürlich über viele clevere Funktionen zur Programmoptimierung, auf die wir hier nicht näher eingehen müssenEs scheint, dass die Angelegenheit hier ein Ende haben kann, aber bei eingehender Recherche zu Flash Player haben wir einige tiefer liegende Probleme entdeckt ----- und die Gründe für die schlechte Hardwarebeschleunigungsleistung von Adobes Flash Player, die vielfach kritisiert wurde ; Ohne Berücksichtigung der Hardwarebeschleunigung spezieller GPUs betrachten wir nur die Standard-Hardwarebeschleunigungsmethode (OpenGL ES/OpenVG), um dieses Problem zu erklären. Als Adobes FlashPlayer geboren wurde, gab es keinen universellen 2D-Vektoranzeigestandard (wie OpenVG). Die 2D-Vektorgrafik-Anzeige kann als ein Highlight bezeichnet werden. Nach mehr als zehn Jahren Entwicklung und Optimierung wurde die 2D-Software-Vektor-Rendering-Engine perfektioniert Die Engine wurde von FlashPlayer 4 auf FlashPlayer 8 nicht verbessert. Eine so große Änderung kann auch erklären, warum die Rendering-Leistung der Adobe FlashPlayer-Software sogar besser ist als die Verwendung von Low-End-Hardwarebeschleunigung. Erfolg ist jedoch auch ein Misserfolg und zu perfekte Standards und Algorithmen Möglicherweise behindern sie die Verwendung der Standard-Hardwarebeschleunigung (Hardwarebeschleunigung für spezielle GPUs, da ihre Flexibilität nicht in unserer Überlegung liegt). Wir haben die offiziellen Dokumente von Adobe weiterhin sorgfältig studiert und festgestellt, dass sich FlashPlayer hinsichtlich der Füllung von herkömmlichen 2D-Vektor-Engines unterscheidet Gesetz: Herkömmliche 2D-Vektor-Engines (z. B. OpenVG/gingkoVG) verfügen über zwei Füllregeln: die Füllregel „Gerade-ungerade“ (Füllregel „Gerade-ungerade“) und die Füllregel „Nicht-Null“ (Füllregel „Nicht-Null“). Der FlashPlayer von Adobe fügt eine Kante hinzu Füllregel ( Kanten-Kanten-Füllregel), und die meisten 2D-Vektor-Engines verwenden eine einzige Farbmethode (RColor) für jede Form/jedes Objekt. In der Kanten-Kanten-Füllregel kann eine Kante je nach links und rechts zwei verschiedene Farbmethoden haben Richtig (Farbe1/Farbe2). Der Grund, warum Adobe dies tut, besteht natürlich darin, die Flexibilität des Software-Renderings zu erhöhen. Wenn sich beispielsweise zwei Formen überschneiden, sind für den Schnittpunkt unterschiedliche Farbmethoden zulässig, wie in der Abbildung gezeigt:
Entschuldigung. Darüber hinaus führt dies zu Verwirrung bei der Verwendung von Standard-Grafikbeschleunigungs-Engines (OpenVG/OpenGL): Das heißt, wir haben möglicherweise unterschiedliche Schattierungsmethoden für eine Form, was im Gegensatz zu den meisten 2D-Modellen zu stehen scheint Vektor-Engines; zwar für Kanten Wir können die Füllregeln als zwei verschiedene ungerade und gerade Füllregeln betrachten, aber wenn man bedenkt, dass sich die Füllregeln für jede Kante jederzeit ändern können, ist die erneute Bestätigung einer Form mit einer einzelnen Farbe nicht das einfach, insbesondere für eine Form, die aus Kurven besteht. Dieses Problem ist jedoch im Vergleich zum Rendern von 2D-Vektorgrafiken nicht sehr problematisch, aber wir können feststellen, dass Adobe FlashPlayer für die meisten herkömmlichen 2D-Vektor-Engines heutzutage nicht „freundlich“ zu sein scheint ----- Programmierer müssen sorgfältig eine Zwischenebene schreiben , das ist nicht die Schuld von Adobe: Diese 2D-Vektordarstellungsstandards (OpenVG) gab es noch nicht, als FlashPlayer geboren wurde. Es ist nur schade, dass Adobes FlashPlayer kein Open-Source-Programm ist (AVM2 von Adobe FlashPlayer). Quelle), also müssen wir geduldig warten, bis Adobe dies für uns erledigt, es sei denn, wir verwenden nicht den offiziellen FlashPlayer
(Wir verwenden selbst den FlashPlayer von OpenVG)