Was ist die technische Definition von "Sprite Batching"?
17
Plattform- und sprachunabhängig, wie ist Sprite-Batching definiert? Es scheint, als ob es viele verschiedene Techniken gibt, um den Arbeitsaufwand beim Zeichnen zu verringern, und dass sie oft mit "Batching" verwechselt werden. Mir fällt ein, dass es vielleicht keine richtige Antwort gibt, aber vielleicht hat hier jemand etwas gefunden, was ich nicht habe.
Technisch bedeutet "Batching", dass mehrere Aktionen und deren Daten in einer Datenstruktur zusammengefasst werden, sodass alle Aktionen gleichzeitig und nicht einzeln ausgeführt werden können.
Der größte Engpass bei modernen GPUs ist nicht ihre Arbeitsleistung, sondern die Kommunikation zwischen Ihrem Spiel, das auf der CPU läuft, und der GPU. Jedes Datenpaket, das an die GPU gesendet wird, hat einen Overhead, aber der Overhead eines kleinen Pakets ist genauso groß wie der eines großen Pakets. Daher ist es ein großer Gewinn, wenn Sie ein großes Paket senden, anstatt hundert kleinere. Und genau das ist Batching. aus all diesen kleinen Päckchen ein großes Päckchen machen.
Stapelverarbeitung ist besonders nützlich für Sprites, da die Datenmenge pro Sprite lächerlich gering ist. vier Eckpunkte und vier Texkoordinaten. Der Overhead des kleinen Pakets ist also proportional groß.
+1 für die Erwähnung des Latenzproblems; Dies ist das gleiche Prinzip, das auch für den Netzwerkverkehr und die Datenträger-E / A gilt. Im Allgemeinen sind nur wenige große Stapel wichtiger als viele kleine Stapel.
Maximus Minimus
9
Sprite-Batching ist die Methode, mit der mehrere Sprites mit einem einzigen Draw-Aufruf an die GPU gesendet werden.
Keine der anderen Antworten weist auf den eigentlichen Grund dafür hin: Minimierung von Statusänderungen und Übermittlung von GPU-Befehlen. Wenn Sie 100 von mir gezeichnete Sprites mit jeweils eigener Textur haben, kann die Hardware jeweils nur ein Sprite verarbeiten. Die Dutzende oder sogar Tausende von Shader-Kernen werden kaum genutzt, und die GPU verbringt viel zu viel Zeit damit, ihren Render-Status für Texturwechsel zu konfigurieren.
Wenn Sie alle Ihre Sprite-Bilder in einen Atlas einfügen, können Sie die zum Zeichnen erforderlichen Statusänderungen minimieren. Der Treiber ist möglicherweise sogar in der Lage, Sprite Draw-Anforderungen automatisch in einem Stapel zu kombinieren, sodass die Hardware voll genutzt werden kann. Dies ist jedoch nicht garantiert oder wahrscheinlich.
Wenn Sie einen Sprite-Atlas verwenden und dann ein einzelnes VBO mit all Ihren Sprites-Quads erstellen und eine einzelne Zeichnungsanforderung mit diesen Daten durchführen, ist sichergestellt, dass die Hardware voll ausgelastet ist und alle Ihre Sprites parallel gerendert werden.
Sprite Batching erledigt dann genau das: Sie können so viele Ihrer Sprites wie möglich in einem einzigen VBO mit einem einzigen Atlas zusammenfassen, der mit einem einzigen Draw Call an die GPU gesendet wird, um die GPU-Nutzung zu maximieren.
Es gibt andere Möglichkeiten zum Sprite-Batching (z. B. Hardware-Instanzen, Verwendung von Geometrie-Shadern usw.) und andere Vorteile, aber das Wesentliche ist, dass beim Batching mehrere Objekte pro Zeichenaufruf gezeichnet werden.
-1: Das Minimieren der Statusänderungen ist nicht "der Punkt" der Stapelverarbeitung. Es ist nur eine Anforderung, die sich aus der Art und Weise ergibt, wie OpenGL strukturiert ist. (Dies ist der Punkt, an dem es um Texturatlanten geht, aber diese wurden nicht gefragt.) In der Frage wird speziell eine Definition für "Plattform und Sprache agnostisch" verlangt.
API-Beast,
Die Methode, alles in einen Backbuffer zu zeichnen, löst also zunächst dieses Problem. Wie? Werden die Daten nicht immer noch einzeln für ein einzelnes Bild im Speicher bearbeitet und dann in den vorderen Puffer verschoben? Ich denke, mein Verständnis muss ein bisschen fehlerhaft sein.
Bloodyaugust
4
Mr. Beast: Es hat nichts mit OpenGL oder irgendeiner Plattform oder Sprache zu tun. So funktioniert die Hardware selbst auf allen Plattformen und allen Grafik-APIs, die eine beliebige Sprache verwenden.
Sean Middleditch
6
Es ist kein genau definierter Fachbegriff. Stapelverarbeitung ist im Grunde jedes System, bei dem Sie mehrere Vorgänge als Gruppe und nicht einzeln ausführen. Dies geschieht häufig, weil dies effizienter ist. Die Effizienzgewinne resultieren normalerweise daraus, dass der für die Operation erforderliche Kontext teilweise oder vollständig wiederverwendet werden kann.
Sprite-Batching ist also nur ein beliebiges System, mit dem Sie mehrere Sprites gleichzeitig zeichnen und dadurch hoffentlich eine gewisse Effizienz erzielen können. Normalerweise besteht der Vorteil darin, dass Ihr Sprite-Stapel dieselbe Textur verwendet, sodass Sie alle Sprites im Stapel zeichnen können, ohne die Textur zu ändern. Dies ist ein relativ langsamer Vorgang.
Sprite-Batching ist die Methode, mit der mehrere Sprites mit einem einzigen Draw-Aufruf an die GPU gesendet werden.
Keine der anderen Antworten weist auf den eigentlichen Grund dafür hin: Minimierung von Statusänderungen und Übermittlung von GPU-Befehlen. Wenn Sie 100 von mir gezeichnete Sprites mit jeweils eigener Textur haben, kann die Hardware jeweils nur ein Sprite verarbeiten. Die Dutzende oder sogar Tausende von Shader-Kernen werden kaum genutzt, und die GPU verbringt viel zu viel Zeit damit, ihren Render-Status für Texturwechsel zu konfigurieren.
Wenn Sie alle Ihre Sprite-Bilder in einen Atlas einfügen, können Sie die zum Zeichnen erforderlichen Statusänderungen minimieren. Der Treiber ist möglicherweise sogar in der Lage, Sprite Draw-Anforderungen automatisch in einem Stapel zu kombinieren, sodass die Hardware voll genutzt werden kann. Dies ist jedoch nicht garantiert oder wahrscheinlich.
Wenn Sie einen Sprite-Atlas verwenden und dann ein einzelnes VBO mit all Ihren Sprites-Quads erstellen und eine einzelne Zeichnungsanforderung mit diesen Daten durchführen, ist sichergestellt, dass die Hardware voll ausgelastet ist und alle Ihre Sprites parallel gerendert werden.
Sprite Batching erledigt dann genau das: Sie können so viele Ihrer Sprites wie möglich in einem einzigen VBO mit einem einzigen Atlas zusammenfassen, der mit einem einzigen Draw Call an die GPU gesendet wird, um die GPU-Nutzung zu maximieren.
Es gibt andere Möglichkeiten zum Sprite-Batching (z. B. Hardware-Instanzen, Verwendung von Geometrie-Shadern usw.) und andere Vorteile, aber das Wesentliche ist, dass beim Batching mehrere Objekte pro Zeichenaufruf gezeichnet werden.
quelle
Es ist kein genau definierter Fachbegriff. Stapelverarbeitung ist im Grunde jedes System, bei dem Sie mehrere Vorgänge als Gruppe und nicht einzeln ausführen. Dies geschieht häufig, weil dies effizienter ist. Die Effizienzgewinne resultieren normalerweise daraus, dass der für die Operation erforderliche Kontext teilweise oder vollständig wiederverwendet werden kann.
Sprite-Batching ist also nur ein beliebiges System, mit dem Sie mehrere Sprites gleichzeitig zeichnen und dadurch hoffentlich eine gewisse Effizienz erzielen können. Normalerweise besteht der Vorteil darin, dass Ihr Sprite-Stapel dieselbe Textur verwendet, sodass Sie alle Sprites im Stapel zeichnen können, ohne die Textur zu ändern. Dies ist ein relativ langsamer Vorgang.
quelle