OpenGL是否可以防止不必要的API调用?

时间:2013-06-17 08:29:15

标签: c++ opengl optimization

目前我的管道中有大约15个渲染过程。对于每次传递,我在绘制之前设置正确的设置,然后重置它们。这些设置包括视口大小,打开或关闭深度测试,混合功能或关闭,模板功能,模板操作等。

我想知道OpenGL是否足够聪明,可以忽略设置已存在状态的API调用。因为否则我会用很多标志跟踪状态,并且在渲染过程之前只设置状态,如果实际需要的话。

3 个答案:

答案 0 :(得分:7)

简短回答:这取决于司机。

OpenGL本身并没有做太多的事情。供应商可以按照他们认为合适的方式实现标准规定的功能。他们通常是否测试现有状态以避免不必要地拖延管道?也许,但缺乏阅读供应商的建议或自己衡量绩效,没有办法确定。

我所看到的建议的共识(没有参考,因为它遍布各处),是你应该避免使用冗余状态变化调用OpenGL。它不会造成太大的伤害,它可能会有所帮助。

在你的情况下(在传球之间每帧改变状态几次),它可能没有太大的区别。

答案 1 :(得分:2)

  

因为否则我会用很多旗子跟踪状态   并且在渲染过程之前仅设置状态(如果它实际上是)   必要的。

请注意,这可能会或可能不会比保持原样更快。正如其他人所说,OpenGL只是一个API规范,将实现留给GPU供应商(或Mesa等开源社区)。一般来说,你应该期望每次通话产生一些结果,但如果你的主要关注点是表现,那么真正选择的唯一方法是分析

这些结果可能因平台而异,甚至可能因图形驱动程序的版本而异,有时也会出现像电池电源那样无法预料的事情。在测量之前,您无法说出应用程序中存在真正的性能问题。

答案 2 :(得分:-1)

其中很多似乎是标志,设置标志可能比测试和设置标志更昂贵。所以问题是OpenGL是否足够愚蠢而不是足够聪明。

对于其他人我怀疑计算成本,或许设置转换矩阵与实际渲染工作相比是否显着,因此不值得在图书馆级别进行优化。