Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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

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
C++ OpenGL是否防止不必要的API调用?_C++_Opengl_Optimization - Fatal编程技术网

C++ OpenGL是否防止不必要的API调用?

C++ OpenGL是否防止不必要的API调用?,c++,opengl,optimization,C++,Opengl,Optimization,目前,我的管道中大约有15个渲染过程。对于每个过程,我在绘制之前设置正确的设置,然后重置它们。这些设置包括视口大小、打开或关闭深度测试、混合功能或关闭、模具功能、模具操作等 我想知道OpenGL是否足够聪明,可以忽略设置已经存在状态的API调用。因为否则我会用很多标志跟踪状态,在渲染过程之前,只有在实际需要时才设置状态。其中很多似乎是标志,设置标志可能比测试和设置标志更昂贵。因此,问题在于OpenGL是否足够愚蠢,而不是足够聪明 对于其余的部分,我怀疑计算的成本,也许设置转换矩阵与实际渲染工作相

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


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

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


对于其余的部分,我怀疑计算的成本,也许设置转换矩阵与实际渲染工作相比会很重要,因此不值得在库级别进行优化。

简短的回答:这取决于驱动程序

OpenGL本身并没有做很多事情。由供应商以其认为合适的任何方式实现标准规定的功能。他们是否通常测试现有状态,以避免不必要地暂停管道?也许吧,但除了阅读供应商的建议或自己衡量性能之外,没有办法确定

我所看到的建议的一致意见是(没有参考,因为它遍布各地),您应该避免调用带有冗余状态更改的OpenGL。它不会造成太大的伤害,也可能会带来一些好处

在您的情况下(在过程之间每帧更改几次状态),这可能不会有太大的区别

因为否则我会用很多旗子来追踪这个州 在渲染过程之前,仅当状态实际为 必要的

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


这些结果可能因平台而异,甚至可能因图形驱动程序的版本而异,有时还会出现一些意想不到的情况,如使用电池供电。在进行度量之前,您无法确定应用程序中真正的性能问题是什么。

更简短的回答是:否。当驱动程序从其队列中提取命令并因此有机会忽略重复调用时,您已经进行了API调用。此外,查询状态通常涉及暂停管道,这比冗余设置要昂贵得多。@Damon。驱动程序不必查询状态,它可以很容易地缓存在变量中。此外,如果我们假设驱动程序开发人员实施了此测试,或者他们没有意义,那么在这两种情况下,我自己实施它是没有意义的。@danijar:图形中只有两种状态更改会真正影响性能:纹理开关和着色器开关。出于这个原因,通常在渲染之前按纹理和着色器进行排序。@datenwolf:不过请注意,这只考虑GPU暂停部分。至于驱动程序CPU开销,几乎每一个状态更改都可能是有害的,甚至只是更改顶点缓冲区的基指针(正如X-Plane作者在其博客IIRC中提到的)@danijar:状态可能会被缓存(至少是一些),但事实并非如此。否则,
glGet
将是闪电般的快,而事实并非如此。这是最慢的函数之一。@Damon:嗯。。。你认为我应该把“可能”改为“可能不”(或者“可能”作为折衷:-)?我问了一个关于GLSL制服的“类似”问题:。答案也是“这取决于司机”:)不要做出这样的假设。在许多高速缓存内存体系结构上,无条件写操作必须一直复制到后面,但是读/比较/条件写操作可能会避免昂贵的写操作。