2015-08-28 138 views
0

我已经成功更新了我的渲染引擎以使用统一缓冲区对象和实例化。 问题是,因为我做了第一个平截头体剔除传递每帧以便知道我需要绘制的对象,所以我必须更新每个帧的缓冲区,因为我绘制的对象每次都会更改,而这不是最有效的事情。通过实例化和剔除来有效更新统一缓冲区对象

我怎样才能让这个效率更高?

我能想到的唯一的事情就是不要进行平截头体剔除,因此所有的缓冲区都保持静态,我不需要一直更新它们,但是没有进行截锥体剔除,我最终会画很多不必要的物体。

+0

你如何更新缓冲区? –

+0

@Reet Koradi:显然这与zeb的其他近期问题有关,它没有被接受的答案,[here](http://stackoverflow.com/questions/32222574/is-it-better-glbuffersubdata-or-glmapbuffer)。 –

回答

0

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

你需要关注的是如何使这种效率更高,实际上是容纳排队的不完整命令。由于数据写入模式较差,驱动程序/ GPU被迫停止处理下一帧/命令的问题比遇到数据传输速率限制的问题更有可能遇到问题。问题始终是要避免您可能会写入部分仍在使用的数据的GPU(它通常在CPU后面数据1-2帧)。

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


你将不得不做一些性能测试肯定地说,但我怀疑CPU端域剔除与您的实例的缓冲区成为孤儿UBO将给予良好的效果相结合。与其重复使用以前帧中的任何数据,您只需将每个帧的整个实例UBO从CPU流式传输到GPU,并在GPU完成每帧时放弃旧的UBO。

+0

好的。所以我会尝试实现与非同步缓冲区的孤立,因为你和@mmostajab建议我(在另一篇文章[这里])(http://stackoverflow.com/questions/32222574/is-it-better-glbuffersubdata-or-glmapbuffer)) – zeb

+0

好吧,我已经更新了我的引擎,使用带有孤儿的非同步缓冲区,我可以看到现在花在更新缓冲区上的时间非常短,现在花在渲染所有场景上的时间大约是1.8ms。我不明白的是,即使我花在准备和绘制场景上的时间太少,即使VSync已停用,我的速度也不会超过60fps。看看时间表,我可以看到SwapBuffers函数正在耗尽我所有的时间 – zeb