2016-08-02 40 views
7

Man kann normale JavaScript-Funktionen vergleichen, indem man zählt, wie oft er diese Funktionen in einer Sekunde aufrufen kann. In WebGL sind Funktionen wie gl.drawArrays jedoch asynchron, sodass Sie die Zeit, die der Shader benötigt, nicht messen können, indem Sie den API-Aufruf vergleichen.Wie kann ich einen WebGL-Shader benchmarken?

Gibt es eine Möglichkeit, WebGL-Funktionen zu benchmarken?

Antwort

3

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

2

Es gibt keine Möglichkeit, ohne vielleicht einige GPU herstellerspezifische Tools genaue Shader Ausführungszeit zu erhalten. Zusätzlich zu dem Vorschlag von gman gibt es eine EXT_disjoint_timer_query Erweiterung, die es erlaubt, die Ausführungszeit Ihres Zeichnungsaufrufs zu messen, der wiederum stark von der Shader-Ausführungszeit abhängt, besonders wenn Ihre Shader ziemlich schwer sind (also die meiste Zeit der GPU für die Ausführung benötigt wird) Anrufe zeichnen).

+0

'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

+0

@ 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. –

+0

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