我正在使用OpenGL(通过OpenTK)对GPU上的大量点云数据执行空间查询。每帧数据大约为200k点。这适用于低数量的查询(< 10queries @ 60fps)但不会扩展,因为每个数据帧执行的更多(100queries @ 6fps)。
我原本期望现代GPU可以从100个绘制通话中咀嚼2000万点(200k * 100个查询)点而不会出汗;特别是因为每个glDrawArrays
使用相同的VBO。
'空间查询'包括设置一些制服和glDrawArrays
调用。然后,geom着色器根据查询结果选择发射或不发射顶点。我尝试过/不使用分支,它没有任何区别。使用的VBO是分离的属性,一个是STATIC_DRAW
,另一个是DYNAMIC_DRAW
(在每个空间查询批处理框之前更新)。转换反馈然后收集数据。
分析显示,glGetQueryObject
是迄今为止最慢的呼叫(可能阻塞,5600个包含样本与来自glDrawArrys
的127个样本)但我不确定如何改进这一点。我尝试在GPU内存中创建大量的小结果缓冲区并为每个查询绑定一个新的转换反馈缓冲区,但这没有任何效果 - 可能是因为在单核上运行?另一种选择是从另一个线程中读取前一个查询中的视频内存,但这会引发Access Violation
并且我不确定增益是否会那么显着。
有关如何提高性能的任何想法?我是否遗漏了一些需要关闭的调试模式?