Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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/4/c/60.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++ 2D OpenGL场景因大量重叠形状而变慢_C++_C_Optimization_Opengl - Fatal编程技术网

C++ 2D OpenGL场景因大量重叠形状而变慢

C++ 2D OpenGL场景因大量重叠形状而变慢,c++,c,optimization,opengl,C++,C,Optimization,Opengl,我正在用OpenGL绘制二维图形。他们没有使用那么多多边形。我注意到我可以有很多很多形状,只要它们不重叠。如果我得到后面的形状后面的形状。。。。等它真的开始落后了。我觉得我可能做错了什么。这正常吗?有没有办法解决这个问题(我不能忽略渲染,因为我对alpha进行混合)。我还启用了CW背面消隐 谢谢如果形状不透明,您需要前后顺序排列。然后,深度测试可以快速轻松地拒绝每个像素 然后,如果它们是透明的,您需要将它们前后顺序排列。无序渲染透明度的速度非常慢 编辑:嗯,我(不知何故)忽略了这是2D的事实,尽

我正在用OpenGL绘制二维图形。他们没有使用那么多多边形。我注意到我可以有很多很多形状,只要它们不重叠。如果我得到后面的形状后面的形状。。。。等它真的开始落后了。我觉得我可能做错了什么。这正常吗?有没有办法解决这个问题(我不能忽略渲染,因为我对alpha进行混合)。我还启用了CW背面消隐


谢谢

如果形状不透明,您需要前后顺序排列。然后,深度测试可以快速轻松地拒绝每个像素

然后,如果它们是透明的,您需要将它们前后顺序排列。无序渲染透明度的速度非常慢

编辑:嗯,我(不知何故)忽略了这是2D的事实,尽管OP反复提到它。

你的两个案例(重叠和不重叠)使用的是完全相同的形状集吗?因为如果重叠情况涉及的所有形状的总面积比第一种情况大,那么预计速度会慢一些。如果是同一组形状,如果其中一些重叠,则速度会减慢,那么这将是非常不寻常的,不应该发生在任何标准硬件OpenGL实现上(您使用的是什么平台?)。背面剔除不会造成任何问题

无论何时绘制形状,GPU都必须为屏幕上覆盖的每个像素做一些工作。如果你在同一个地方画同一个形状100次,那么这就是像素工作的100倍。如果按深度排序的顺序绘制对象,深度缓冲可以减少不透明对象的一些额外成本,但这种技巧对于使用透明度的对象不起作用


使用透明度时,重要的是每个渲染形状的面积之和。不是所有渲染后覆盖的屏幕数量。

它们是按绘制顺序排序的,考虑到我正在绘制2D形状,我应该启用深度缓冲区吗?我正在执行glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去_SRC_ALPHA);在任何类型的台式计算机上,如果启用深度检查,前后绘制不透明对象的速度都会更快。但是透明对象总是需要向后拉到前面,并且不能从深度缓冲中受益。如果我在其顶部有相同的形状,则其速度比100次慢100倍,彼此之间间隔5个单位。您使用的是什么硬件/驱动程序?这不应该发生在任何硬件加速的GL实现中。除非您的非重叠外壳将某些形状从窗口边缘移开,因为GPU可以跳过视图截锥体外部对象的某些工作。