函数调用与内联之间的 GLSL 性能差异

Dan*_*ela 5 opengl performance gpu glsl shading

如果像 + 运算符这样简单的东西被包装到函数中,GLSL 中的性能是否会有所不同?

例如这两种情况:

示例1:

in uniform float uValueA;
in uniform float uValueB;

void main()
{
    float value = uValueA + uValueB;
    // [...]
}
Run Code Online (Sandbox Code Playgroud)

示例2:

in uniform float uValueA;
in uniform float uValueB;

float addValues(float a, float b)
{
    return a + b;
}

void main()
{
    float value = addValues(uValueA, uValueB);
    // [...]
}
Run Code Online (Sandbox Code Playgroud)

编译后的最终产品有什么区别吗?或者它们会产生相同数量的指令和性能吗?

Mue*_*ito 0

您基本上可以对着色器的优化进行任何假设,因为编译是特定于供应商的。编译器会优化这个非常简单的情况,并内联该函数,使两者等效,这是有道理的,但这并不能保证。理论上,他们可以为每个函数调用插入一百万个无操作(尽管编写编译器的人可能会被解雇:))。

也就是说,您可以“预优化”您的 GLSL 代码,以便在将代码发送到编译器之前执行这些类型的优化(通常离线完成)。glsl -optimizer经常用于此目的,并内置于 Unity 引擎中。