2017-08-13 76 views
0

曾经有人说“管理”OpenGL状态很有用(刚刚从2001年看到一篇文章)。像这样的(C++):缓存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); 
    } 
} 

我可以看到,这可能是有用的还是在的情况下OpenGL的服务器不在同一个地方OpenGL的客户端。但是在我的'游戏'引擎中肯定不是这样,所以让我们假设OpenGL客户端总是与OpenGL服务器在同一台机器上。

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

有人可能会说我应该自己介绍一下,但我不认为结果会很重要,因为有很多不同的图形适配器,驱动程序,CPU和操作系统,我的个人测试不足以代表。

编辑:怎么这样的事情绑定的缓冲区,帧缓存,纹理,...

+3

这取决于。如果你正在做很多不必要的电话,那么是的,你会从中受益。但最终它会下达“衡量它”。这也是任何人都可以做的唯一的事情。 – BDL

+0

缓冲区,你也可以使用直接状态访问的方式;) –

回答

2

是它仍然(它的2017年现在)值得拥有这一切的检查代码占用的周期,而不是只总是打电话给司机?

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

状态缓存在以前的情况下非常有用:当您无法直接控制正在发生的情况时。例如,如果你正在编写游戏引擎,你对你打算做什么渲染操作以及打算如何执行渲染操作有深入的了解。你知道所有的网格物体都将使用脸部剔除,并且你可以让你的艺术家/工具管道相应地处理它。您可以关闭面部剔除以进行GUI渲染或类似的事情,但这些会是特定的情况。相比之下,如果您正在编写一个通用渲染系统,其中用户几乎完全控制了网格的性质,那么状态缓存可能会有所帮助。如果您的代码被告知哪些网格使用面部剔除,哪些不使用,那么您无法控制这类事情。而且由于更高级别的代码/数据无法直接与OpenGL交谈,因此可以执行一些状态缓存来平滑事情。因此,如果您掌控着事物的呈现方式,如果您控制了数据的广泛性质及其绘制方式,那么您就不需要缓存。你的代码充分地完成了这项工作。在良好的数据驱动设计中,您可以订购数据的呈现,以便您仍然不需要缓存。你只需要一个完全免费的系统,外部世界几乎完全控制了所有状态,并且几乎不考虑状态变化对性能的影响。

+0

这很有道理。谢谢。接受答案,因为我认为你完全正确。 – scippie