Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 函数调用与内联之间的GLSL性能差异_Performance_Opengl_Glsl_Gpu_Shading - Fatal编程技术网

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

Performance 函数调用与内联之间的GLSL性能差异,performance,opengl,glsl,gpu,shading,Performance,Opengl,Glsl,Gpu,Shading,如果将+运算符这样简单的东西包装到函数中,是否会对GLSL的性能产生影响 例如这两种情况: 例1: 在均匀浮点值a中; 在均匀浮动的uValueB中; void main() { 浮动值=uValueA+uValueB; // [...] } 例2: 在均匀浮点值a中; 在均匀浮动的uValueB中; 浮点加法值(浮点a、浮点b) { 返回a+b; } void main() { 浮点值=添加值(uValueA、uValueB); // [...] } 编译的最终产品有什么不同吗?或者它们会

如果将+运算符这样简单的东西包装到函数中,是否会对GLSL的性能产生影响

例如这两种情况:

例1:
在均匀浮点值a中;
在均匀浮动的uValueB中;
void main()
{
浮动值=uValueA+uValueB;
// [...]
}
例2:
在均匀浮点值a中;
在均匀浮动的uValueB中;
浮点加法值(浮点a、浮点b)
{
返回a+b;
}
void main()
{
浮点值=添加值(uValueA、uValueB);
// [...]
}

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

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


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

几年前,当我测试此特定案例时,我发现函数或内嵌代码之间没有性能差异。如果我没记错的话,当时我使用Nvidia和/或AMD的工具查看从GLSL文件生成的汇编代码。这也证实了无论我是否使用函数,程序集都是相同的。这表明函数是内联的

我建议您自己看看着色器的两个版本的汇编代码,以说服自己。这个问题()解释了获取这些信息的一些方法