Moderne GPUs verfügen in der Regel über einen einzelnen Frontend-Bereich, der einen vollständig linearen Befehlsstrom von der CPU verarbeitet. Ob dies ein natürliches Hardware-Design ist oder ob es sich einfach aus der Zeit heraus entwickelt hat, als es einen einzelnen CPU-Kern gab, der Befehle für die GPU generiert, ist umstritten, aber es ist vorerst die Realität. Wenn Sie also einen einzelnen linearen Strom von Zustandsbefehlen generieren, ist es natürlich sinnvoll, diesen Strom linear auf einem einzelnen Thread in der CPU zu generieren! Recht?
Nun, moderne GPUs haben im Allgemeinen auch ein sehr flexibles, einheitliches Backend, das viele verschiedene Dinge gleichzeitig bearbeiten kann. Im Allgemeinen arbeitet die GPU mit Scheitelpunkten und Pixeln mit ziemlich feiner Granularität. Es gibt keinen großen Unterschied zwischen einer GPU, die 1024 Eckpunkte in einer Zeichnung und 512 + 512 Eckpunkte in zwei verschiedenen Zeichnungen verarbeitet.
Dies ist ein ziemlich natürlicher Weg, um weniger Arbeit zu leisten: Anstatt in einem einzigen Aufruf eine große Anzahl von Eckpunkten auf die GPU zu werfen, teilen Sie Ihr Modell in Abschnitte auf, führen Sie in diesen Abschnitten ein billiges Grobculling durch und senden Sie jeden Abschnitt einzeln, wenn er den Test besteht Keulungstest. Wenn Sie es mit der richtigen Granularität tun, sollten Sie eine schöne Beschleunigung bekommen!
Leider sind in der aktuellen Realität der Grafik-API Zeichnungsaufrufe auf der CPU extrem teuer. Eine vereinfachte Erklärung, warum: Statusänderungen auf der GPU möglicherweise nicht direkt mit Grafik-API-Aufrufen korrespondieren. Viele Grafik-API-Aufrufe setzen einfach einen bestimmten Status im Treiber, und der Draw-Aufruf, der von diesem neuen Status abhängt, wird ausgeführt und überprüft Status, der als geändert seit dem letzten Zeichnen markiert ist, schreibt ihn in den Befehlsstrom für die GPU und leitet dann das Zeichnen ein. Dies ist alles Arbeit, die gemacht wird, um einen schlanken und mittleren Befehlsstrom für die GPU-Frontend-Einheit zu erhalten.
Daraus ergibt sich, dass Sie ein Budget für Draw Calls haben, das vollständig vom Overhead des Fahrers bestimmt wird . (Ich glaube, ich habe gehört, dass Sie heutzutage mit etwa 5.000 pro Frame für einen 60-fps-Titel davonkommen können.) Sie können dies um einen großen Prozentsatz erhöhen, indem Sie diesen Befehlsstrom in parallelen Blöcken erstellen.
Es gibt auch andere Gründe (zum Beispiel asynchrone Zeitverzögerung für VR-Latenzverbesserungen), aber dies ist ein wichtiger Grund für grafikgebundene Spiele und andere Drawcall-lastige Software (wie 3D-Modellierungspakete).