Mein Fragment-Shader wurde durch eine kürzliche Änderung erheblich verlangsamt, und ich habe versucht zu verstehen, warum.
Ich habe die Hauptverlangsamung auf den Zugriff auf einen einzelnen einheitlichen Schwimmer isoliert. Wenn ich diese Zeile einbinde:
float not_used = my_uniform;
dann läuft der Shader mehr als doppelt so langsam wie ohne diese Zeile. Der not_used
Float wird nie wieder referenziert.
Warum sollte das passieren? Ich hoffe, es zu verstehen, damit ich versuchen kann, eine schnellere Lösung zu finden.
Ich führe dies auf einem Mac mit Intel HD Graphics 3000 aus. Ich messe die Leistung, indem ich OpenGL-Zeitstempelabfragen vor und nach der Ausführung meiner glDraw
Anrufe durchführe und die ms-Intervalle betrachte. Ich kann weitere Spezifikationen / Details angeben, wenn dies bei der Diagnose des Problems hilfreich wäre.
gl{Begin,End}Query
mit GL_TIME_ELAPSED
als Metrik verwende. Dieses Setup berücksichtigt die Art und Weise, wie OpenGL-Befehle asynchron mit der CPU ausgeführt werden. Siehe opengl.org/registry/specs/ARB/timer_query.txt
glFinish()
oder Ihre Pufferaustauschfunktionen aufrufen , damit der Code tatsächlich ausgeführt wird. Auch ein anständiger glsl-Compiler sollte alle nicht verwendeten Uniformen aus Ihrem Code entfernen.