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,我已经成功地更新了渲染引擎以使用统一缓冲区对象和实例。 问题是,由于我在每一帧进行第一次截锥剔除过程,以便了解需要绘制的对象,因此我必须在每一帧更新缓冲区,因为我绘制的对象每次都可能更改,而这并不是最有效的方法 我怎样才能提高效率 我能想到的唯一一件事就是不要做截锥剔除,这样所有的缓冲区都保持静态,我不需要一直更新它们,但如果不做截锥剔除,我会画很多不必要的对象。老实说,更新统一缓冲区是相当便宜的。你的体型非常有限,这就阻止了你做任何疯狂的事情 要使这种方法有效,您需要关注的是如何适应排队的不完

我已经成功地更新了渲染引擎以使用统一缓冲区对象和实例。 问题是,由于我在每一帧进行第一次截锥剔除过程,以便了解需要绘制的对象,因此我必须在每一帧更新缓冲区,因为我绘制的对象每次都可能更改,而这并不是最有效的方法

我怎样才能提高效率


我能想到的唯一一件事就是不要做截锥剔除,这样所有的缓冲区都保持静态,我不需要一直更新它们,但如果不做截锥剔除,我会画很多不必要的对象。

老实说,更新统一缓冲区是相当便宜的。你的体型非常有限,这就阻止了你做任何疯狂的事情

要使这种方法有效,您需要关注的是如何适应排队的不完整命令。由于糟糕的数据写入模式,驱动程序/GPU被迫停止处理下一帧/命令时,您更可能遇到问题,而不是遇到数据传输速率限制。问题总是要避免写入GPU仍在使用的部分数据的情况(GPU通常在CPU后面处理1-2帧的数据)

根据您的目标版本,您有多个选项,OpenGL Wiki有多种缓冲流方法



您必须进行一些性能测试才能确定这一点,但我怀疑CPU端截头体剔除与实例UBO的缓冲区孤立相结合将产生良好的结果。与其重用以前帧中的任何数据,您只需将整个实例UBO从CPU流式传输到每个帧的GPU,并让GPU在完成每个帧时丢弃旧的UBO。

Ok。因此,我将尝试按照您和@mmostajab的建议(在另一篇文章中)使用非同步缓冲区实现孤立。好的,我已经更新了我的引擎,使用非同步缓冲区实现孤立。我可以看到,我现在花在更新缓冲区上的时间非常少,我现在花在渲染所有场景上的时间约为1.8毫秒。我不明白的是,即使我花在准备和绘制场景上的时间太少,我也无法获得超过60fps的速度,即使禁用了VSync。查看时间轴,我可以看到SwapBuffers函数占用了我所有的时间。你是如何更新缓冲区的?@Reto Koradi:显然这与zeb最近提出的另一个问题有关,这个问题没有公认的答案。