gpt4 book ai didi

opengl - 上传流媒体点的最快方法,偶尔删除

转载 作者:行者123 更新时间:2023-12-01 01:06:34 25 4
gpt4 key购买 nike

所以我有一个系统(使用 OpenGL 4.x),我从外部源接收点流(可能带有颜色和/或法线)。我需要将这些点绘制为 GL_POINTS,运行自定义可切换着色器进行着色(颜色可以程序生成,或者来自顶点颜色或法线方向)。

该流包括以相当规则的间隔(4 到 10 hz)接收一组任意计数(通常从 1k 到 70k 点)的点(有或没有正常或颜色),我需要将这些点添加到我当前的积分并绘制所有积分到目前为止收到的积分。

我保证我的顶点类型不会改变,我在流媒体开始时被告知要期待什么,所以我要么使用交错的顶点:pos+normal+color、pos+normal、pos+color,或者只是位置

我当前的解决方案是在指定最大顶点数(使用动态提示分配)的配置文件中分配适当顶点类型的交错顶点 VBO(带有周围的 VAO)。

随着新点的出现,我通过 glBufferSubData 填充了我当前未填充的 VBO。我记录了当前边界 VBO 到目前为止有多少个顶点的计数 (activePoints),并使用 glBufferSubData 填充以 activePoints 开头的范围,如果我当前的更新组的顶点多于我的边界缓冲区(因为我限制每个 VBO 的顶点数),然后我分配一个新的 VBO 并填充从 0 开始的范围,并以更新组中剩余的点数结束(未添加到最后一个缓冲区),如果我还有点剩余我一次又一次地这样做。一个更新组跨越 2 个以上的缓冲区的情况很少见。

渲染时,我使用 glDrawArrays(m_DrawMode,0,numVertices) 渲染我所有的 VBO(-1),其中 numVertices 等于最大缓冲区允许大小,我的边界缓冲区使用 glDrawArrays(m_DrawMode,startElem,numElems) 来解释它没有完全填充有效的顶点。

当然,在某些时候,我将获得比交互式绘制更多的点,因此我有一个 LRU 机制,可以根据需要解除分配最旧的(根据 LRU alg)VBO 集。

有没有更优化的方法来做到这一点?缓冲区孤儿?流媒体提示? map 与子数据?还有什么?

第二个问题是我现在被要求删除点(以不规则的间隔),一次从 10 到 2000 不等。但是这些点在我最初收到的顺序中是不规则的。我可以找出它们当前退出的缓冲区中的偏移量,但它更多的是散射而不是范围。我一直通过在正确的缓冲区中找到它们的偏移量并一个一个地调用范围为 1 的 glBufferSubData 来“删除它们”(它们在缓冲区中彼此并排很少见),并将那里的 pos 更改为远离某个地方他们永远不会被看到。最终我想缓冲区应该从这些删除请求中删除,但我目前不这样做。

什么是更好的处理方法?

最佳答案

映射可能比 glBufferSubData 更有效,尤其是在必须“删除”点时。显式刷新可能特别有帮助。此外,映射允许您将缓冲区的填充卸载到另一个线程。
一定要确保访问位正确(或性能很差),特别是如果您所做的只是写,则不要映射“读取”区域。

正如您可能知道的那样,从顶点缓冲区中删除点并不容易。对于“很少”的点(例如 10 或 20),我只会设置 w = 0,这会将它们移动到无穷大并像以前一样继续绘制整个事物。如果您的剪裁平面不是无穷大,这只会丢弃它们。通过显式刷新,您甚至不需要在内存中保留一个单独的副本。
对于“很多”点(例如 1,000),您可以考虑使用 glCopyBufferSubData去除“洞”。在 GPU 上移动内存速度很快,对于数千点来说,这可能是值得的。然后,您需要为每个顶点缓冲区维护一个计数,以便在删除一些点后绘制更少的点。

要“删除”整个顶点缓冲区,您应该孤立它们(并重用)。 OpenGL 将代表自己做正确的事情,这是保持绘图和重用内存的最有效方法。

使用 glDrawElements而不是 glDrawArrays正如 Andon M. Coleman 的评论中所建议的那样通常是一个很好的建议,但会 不是 在这种情况下帮助你。人们想要这样做的原因是转换后缓存通过按索引标记顶点来工作,因此绘图元素利用了转换后缓存,而绘图数组则没有。但是,转换后缓存仅对复杂的几何图形有用,例如三角形列表或三角形条。您正在绘制点,因此在任何情况下都不会使用转换后缓存——但使用索引会增加 GPU 和 PCIe 总线上的内存带宽。

关于opengl - 上传流媒体点的最快方法,偶尔删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com