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)最感兴趣,但任何有关图形分析的建议都将受到欢迎!
通常仍然是因为您可能最初相信 \xe2\x80\x94 GPU 通常是作为非常宽的 SIMD 处理器实现的,因此对每个像素执行相同的操作可以同时处理很多像素,而对每个像素选择不同的操作会使计算变得更加困难。这就是为什么像这样的操作step能够在 GLSL 中生存下来。一个好的 GLSL 编译器通常可以消除编译时条件,并且可能能够通过其他方式使分支代码不分支,但 GLSL 编译器通常不如普通的离线语言编译器,因为它们有自己的性能预算需要担心。
我是一名 iOS 专业人士,因此我可以详细讨论 Xcode 框架分析器的奇妙之处,并且这样做是为了获得完整的答案,但我很抱歉我无法提供太多有关 Android 的信息。
\n\n在 Xcode 中有一个帧捕获按钮。点击它,将捕获单帧的完整 OpenGL 命令流。从那里您将能够检查每个 OpenGL 命令之前和之后的所有状态和缓冲区。将报告每次调用所花费的时间。更好的是,您的 GLSL 代码本身将被分析到行级别 \xe2\x80\x94 \xc2\xb5s 每行代码将被报告。而且,真正将其置于边缘时,您可以立即重写您的 GLSL 代码并重新运行捕获的帧,以了解您的成本发生了什么。或者只是作为一个快速反馈的 GLSL 创作环境,尽管这并不是该工具的真正用途。
\n| 归档时间: |
|
| 查看次数: |
2218 次 |
| 最近记录: |