分析图形着色器

Les*_*zek 5 opengl glsl glsles

相当长一段时间以来,我一直在避免在着色器代码中进行分支,而不是

float invert_value(in float value)
{
if(value == 0.0)
    return 0.0;
else
    return 1.0 / value;
}
Run Code Online (Sandbox Code Playgroud)

像这样编写“聪明”的代码

float invert_value_ifless(in float value)
{
float sign_value = sign(value);
float sign_value_squared = sign_value*sign_value;
return sign_value_squared / ( value + sign_value_squared - 1.0); 
}
Run Code Online (Sandbox Code Playgroud)

这完全返回第一个函数的功能,并且没有分支,因此速度更快。

或者是吗?我这是在跟鬼打架吗?

如何分析图形着色器以提高速度?我对最近的移动平台(Android)最感兴趣,但任何有关图形分析的建议都将受到欢迎!

Tom*_*mmy 2

通常仍然是因为您可能最初相信 \xe2\x80\x94 GPU 通常是作为非常宽的 SIMD 处理器实现的,因此对每个像素执行相同的操作可以同时处理很多像素,而对每个像素选择不同的操作会使计算变得更加困难。这就是为什么像这样的操作step能够在 GLSL 中生存下来。一个好的 GLSL 编译器通常可以消除编译时条件,并且可能能够通过其他方式使分支代码不分支,但 GLSL 编译器通常不如普通的离线语言编译器,因为它们有自己的性能预算需要担心。

\n\n

我是一名 iOS 专业人士,因此我可以详细讨论 Xcode 框架分析器的奇妙之处,并且这样做是为了获得完整的答案,但我很抱歉我无法提供太多有关 Android 的信息。

\n\n

在 Xcode 中有一个帧捕获按钮。点击它,将捕获单帧的完整 OpenGL 命令流。从那里您将能够检查每个 OpenGL 命令之前和之后的所有状态和缓冲区。将报告每次调用所花费的时间。更好的是,您的 GLSL 代码本身将被分析到行级别 \xe2\x80\x94 \xc2\xb5s 每行代码将被报告。而且,真正将其置于边缘时,您可以立即重写您的 GLSL 代码并重新运行捕获的帧,以了解您的成本发生了什么。或者只是作为一个快速反馈的 GLSL 创作环境,尽管这并不是该工具的真正用途。

\n