我已成功更新渲染引擎以使用统一缓冲区对象和实例化。 问题是,因为为了知道我需要绘制的对象,我每帧进行第一次视锥体剔除传递,我必须每帧都更新缓冲区,因为我绘制的对象每次都可以改变,这不是效率最高的。
我怎样才能提高效率呢?
我唯一能想到的就是不要做截锥体剔除所以所有的缓冲区都保持静态,我不需要一直更新它们,但不要做截头剔除我最终会画出大量的不必要的对象。
答案 0 :(得分:1)
说实话,更新统一缓冲区相当便宜。你的身材非常有限,这使你无法做出太疯狂的事情。
为了提高效率,您需要关注的是实际上容纳排队的不完整命令。由于数据写入模式不佳而导致驱动程序/ GPU被迫停止在下一个帧/命令上工作,因此您更有可能遇到问题,而不会遇到数据传输速率限制。问题始终是避免你可能会写入仍在使用GPU的数据部分的情况(它经常处理CPU后面1-2帧的数据)。
根据您的目标版本,您有多个选项,OpenGL Wiki具有general overview缓冲流方法。
你必须做一些性能测试才能确定,但我怀疑CPU端截头剔除与你的实例UBO的缓冲孤立相结合会产生很好的结果。您不必重复使用先前帧中的任何数据,而是将每个帧的整个实例UBO从CPU流式传输到GPU,并让GPU在完成每个帧时丢弃旧的UBO。