Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
缓存OpenGL状态仍然有意义吗?_Opengl - Fatal编程技术网

缓存OpenGL状态仍然有意义吗?

缓存OpenGL状态仍然有意义吗?,opengl,Opengl,曾经有一段时间,人们说“管理”OpenGL状态很有用(2001年刚刚看到一篇关于它的文章)。像这样(C++): 我可以看出,在OpenGL服务器与OpenGL客户端不在同一位置的情况下,这可能仍然很有用。但在我的“游戏”引擎中肯定不是这样,所以让我们假设OpenGL客户端始终与OpenGL服务器位于同一台机器上 是否仍然值得(现在是2017年)让所有这些检查代码占用周期,而不是总是调用驱动程序 有人可能会说我应该自己分析它,但我认为结果并不重要,因为有太多不同的图形适配器、驱动程序、CPU和操作

曾经有一段时间,人们说“管理”OpenGL状态很有用(2001年刚刚看到一篇关于它的文章)。像这样(C++):

我可以看出,在OpenGL服务器与OpenGL客户端不在同一位置的情况下,这可能仍然很有用。但在我的“游戏”引擎中肯定不是这样,所以让我们假设OpenGL客户端始终与OpenGL服务器位于同一台机器上

是否仍然值得(现在是2017年)让所有这些检查代码占用周期,而不是总是调用驱动程序

有人可能会说我应该自己分析它,但我认为结果并不重要,因为有太多不同的图形适配器、驱动程序、CPU和操作系统,我的个人测试无法充分代表

编辑:那么像绑定缓冲区、帧缓冲区、纹理等等呢

是否仍然值得(现在是2017年)让所有这些检查代码占用周期,而不是总是调用驱动程序

你这样说,好像它曾经是“值得的”。它不是,现在也不是。至少,不是一般的

状态缓存在以前的情况下很有用:当您无法直接控制正在发生的事情时

例如,如果您正在编写一个游戏引擎,那么您对要执行的渲染操作以及要执行渲染操作的时间有着明确的了解。您知道所有网格都将使用面剔除,并且您让美工人员/工具管道相应地处理该问题。您可以为GUI渲染或类似的功能关闭面剔除,但这些都是特定的情况

相比之下,如果您正在编写一个通用渲染系统,其中用户几乎可以完全控制网格的性质,那么状态缓存可能会有所帮助。如果您的代码被告知哪些网格使用面剔除,哪些不使用,那么您无法控制这类事情。由于更高级别的代码/数据无法直接与OpenGL通信,因此可以进行一些状态缓存来平滑处理


因此,如果您可以控制事物的渲染方式,如果您可以控制数据的广泛性质及其绘制方式,那么就不需要缓存。您的代码充分完成了这项工作。在良好的数据驱动设计中,您可以对数据的渲染进行排序,这样您仍然不需要缓存。在一个完全自由运转的系统中,您只需要一个,外部世界几乎完全控制所有状态,几乎不考虑其状态变化对性能的影响。

这取决于具体情况。如果你打了很多不必要的电话,那么是的,你会从中受益。但最终它会滚下来“测量”。这也是其他人唯一能做的事情。对于缓冲区,您也可以使用直接状态访问方式;)这很有道理。非常感谢。我接受了这个答案,因为我认为你是完全正确的。
void CStateManager::setCulling(bool enabled)
{
  if (m_culling != enabled)
  {
    m_culling = enabled;
    if (m_culling)
      glEnable(GL_CULL_FACE);
    else
      glDisable(GL_CULL_FACE);
  }
}