当我在渲染循环中只调用glGetUniformLocation
一次时,这个过程的CPU使用率是否达到30-40%是否正常?我应该只调用一次这个方法并将该位置存储在内存中吗?
这是我的代码:
GLuint Shader::getUniform(const std::string &name) const
{
return glGetUniformLocation(m_programId, name.c_str());
}
答案 0 :(得分:2)
我应该只调用一次这个方法并将该位置存储在内存中吗?
是的,这将是普通的程序。要么是这样,要么是使用fixed locations。
答案 1 :(得分:1)
当我在渲染循环中只调用
glGetUniformLocation
一次时,这个过程的CPU使用率是否达到30-40%是否正常?
通常这样做会浪费CPU周期,但这对整体性能的影响将取决于主机CPU和场景的复杂性。
如果这个简单的东西增加了你的CPU负载,那么你似乎是相当受GPU限制的。在某种程度上,这是一件好事,它表明您正在有效地使用OpenGL API的 rest 。
我应该只调用一次这个方法并将该位置存储在内存中吗?
您需要了解,只有在您关联程序时才会更改位置。即使驱动程序使用像trie这样的优化数据结构来加速搜索,仍然会大量浪费CPU周期来重复执行搜索不会发生变化的事情。
“疯狂一遍又一遍地做着同样的事情并期待不同的结果。” - 爱因斯坦
通常人们会在链接程序后枚举活动的统一位置并持久存储它们。在较新版本的GLSL(4.30或使用GL_ARB_explicit_uniform_location
)中,您可以使用layout (location = N) uniform ...
明确指定制服位置,并避免查询任何内容。