glGetUniformLocation使用了大量的CPU

时间:2015-03-16 18:51:29

标签: opengl

当我在渲染循环中只调用glGetUniformLocation一次时,这个过程的CPU使用率是否达到30-40%是否正常?我应该只调用一次这个方法并将该位置存储在内存中吗?

这是我的代码:

GLuint Shader::getUniform(const std::string &name) const
{
    return glGetUniformLocation(m_programId, name.c_str());
}

2 个答案:

答案 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 ...明确指定制服位置,并避免查询任何内容。