Es ist sehr schwierig, einen Shader zu benoten, weil es eine Menge Kontext gibt und sie sehr GPU-spezifisch sind.
Sie könnten in der Lage sein zu sagen, wenn man Shader schneller als der andere ist durch die Verwendung performance.now
vor und nach ein paar Sachen mit diesem Shader (einige Tausend bis Millionen Zeichenaufrufe), dann zeichnen die GPU Abwürgen von gl.readPixels
aufrufen. Es wird dir sagen, was schneller ist. Es wird Ihnen nicht sagen, wie schnell sie sind, da das Anhalten der GPU die Start- und Stoppzeit beinhaltet.
Denken Sie an ein Rennauto. Für einen Dragster beschleunigst du die Zeit bis zum Ziel. Für ein Rennauto fahren Sie eine Runde auf Hochtouren. Man lässt das Auto zuerst eine Runde fahren, bevor man das Timing macht, man fährt die 2. Runde, das Auto überquert die Startlinie mit voller Geschwindigkeit und die Ziellinie fährt ebenfalls mit voller Geschwindigkeit. Also, du bekommst die Geschwindigkeit des Autos, wo für den Dragster du seine Beschleunigung bekommst (irrelevant für GPUs generell, denn wenn du Geschwindigkeit anstrebst, solltest du sie nie starten und stoppen).
Eine andere Möglichkeit, ohne die Start-/Stoppzeit hinzuzufügen, ist das Zeichnen eines Bündels zwischen requestAnimationFrame
Frames. Erhöhen Sie den Wert solange, bis die Zeit zwischen den Frames einen ganzen Frame hochspringt. Dann vergleiche die Beträge zwischen den Shadern.
Es gibt jedoch andere Probleme in der tatsächlichen Verwendung. Zum Beispiel versucht eine gekachelte GPU (wie PowerVR auf vielen mobilen Geräten), Teile von Primitiven auszuschneiden, die überzeichnet werden. Ein Heavy Shader mit einer Menge Overdraw auf einer nicht gekachelten GPU kann also auf einer gekachelten GPU ziemlich schnell sein.
Stellen Sie auch sicher, dass Sie das richtige Timing sind. Wenn Sie einen Vertex-Shader zeitlich abstimmen, möchten Sie wahrscheinlich Ihre Leinwand 1x1 Pixel und Sie sind Fragment Shader so einfach wie möglich und übergeben Sie viele Scheitelpunkte in einem Unentschieden Aufruf (um die Anrufzeit zu entfernen). Wenn Sie einen Fragment-Shader zeitlich abstimmen, möchten Sie wahrscheinlich eine große Zeichenfläche und eine Reihe von Stützpunkten, die mehrere vollständige Zeichenflächen-Vierecke enthalten.
Siehe auch WebGL/OpenGL: comparing the performance
'EXT_disjoint_timer_query' wird Ihnen keine nützlichen Informationen über gekachelte Architekturen wie PowerVR (iOS) geben, da sie einen Deferred Renderer verwenden, so gut wie sie können, geben Sie die Zeit für den gesamten Frame, nachdem alle Polygone geteilt wurden in Fliesen, Okklusion abgeschnitten, Fliesen alle gerendert, etc. https://imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/ – gman
@ gman Ja. Es handelt sich jedoch um ** Shader ** -Benchmarking. Die Umstände geben eine Chance, TBDR das Leben schwer zu machen und damit einigermaßen angemessene Ergebnisse zu erzielen. Liege ich hier falsch? Habe diese Annahme nie getestet. –
Aber können Sie? Ich schätze, solange Sie die Blending-Funktion einschalten, können Sie sich zumindest ein Bild davon machen, ob ein Shader schneller ist als ein anderer. Mit der Abmischung werden alle Ihre Überziehungen vernichtet. Sie müssen sich nur daran erinnern, dass die Zeit, die Sie zurückbekommen, alle Polygonaufspaltungen, Kachel-Buckettings usw. umfasst, also ist es nicht nur die Zeit Ihres Shaders.Ich nehme an, dass auch davon ausgegangen wird, dass die Erweiterung sogar auf gekachelten Architekturen existiert und was sie tatsächlich zurückgibt. – gman