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_Counter_Atomic - Fatal编程技术网

OpenGL原子计数器缓冲区别名性能

OpenGL原子计数器缓冲区别名性能,opengl,counter,atomic,Opengl,Counter,Atomic,如果我在渲染/计算调度中使用着色器“A”中的原子计数器,但在随后的渲染/计算调度中将该计数器别名为着色器“B”中的缓冲区,但在第二次调度中将其声明为统一或SSBO而不是实际的原子计数器,那么我是否应该注意到任何性能影响?(假设使用了适当的glMemoryBarriers()等) 我知道一些AMD硬件至少有有限的专用原子硬件单元。我猜在这种情况下,如果将计数器结果化名为SSBO,那么计数器结果将稍后写入缓冲区?因此,在这种情况下,最好不要将原子计数器与未明确声明为原子计数器的任何对象混淆 在别人问

如果我在渲染/计算调度中使用着色器“A”中的原子计数器,但在随后的渲染/计算调度中将该计数器别名为着色器“B”中的缓冲区,但在第二次调度中将其声明为统一或SSBO而不是实际的原子计数器,那么我是否应该注意到任何性能影响?(假设使用了适当的glMemoryBarriers()等)

我知道一些AMD硬件至少有有限的专用原子硬件单元。我猜在这种情况下,如果将计数器结果化名为SSBO,那么计数器结果将稍后写入缓冲区?因此,在这种情况下,最好不要将原子计数器与未明确声明为原子计数器的任何对象混淆


在别人问我之前,我无法访问大量相关硬件来测试自己什么是最好的,所以我想知道是否有一个一般的经验法则?性能不是你的问题。你这里的问题是它是否会起作用

根据OpenGL内存模型的规则,如果您执行一些执行原子计数器操作的操作,并且在渲染操作之后从该缓冲区读取数据,那么您需要能够获得所有原子计数器操作的结果。表示同步执行的

这都是真的。。。除非你把它当作原子计数器来读。因为这样,执行模型就变成了。。。定义不太明确。跨多个应用程序同步原子计数器访问不需要实现

现在,原子计数器操作的性质不会因此而改变。例如,如果仅递增或递减计数器,则仍保证在渲染调用中获得唯一值。如果修改计数器的缓冲区存储,然后执行计数器操作,下一个操作将看到修改(由于同步操作)

但是,如果修改此内存的唯一操作是原子计数器,则使用原子计数器读取不能保证从先前的渲染命令中看到原子计数器操作


因此,是的,访问原子计数器的变量将比使用SSBO或UBO或其他什么更快。但你不会得到正确的答案。所以这不是一个好的权衡;)

“假设采取了适当的glMemoryBarriers()”没有。原子计数器不被标准视为是。因此,它们不需要在呈现调用之间进行任何显式同步工作。内部屏障可用于对原子操作进行排序,但除此之外,不能。此外,如果原子计数器不打算存储在缓冲区中(因此可由读取缓冲区的任何操作读取),则缓冲区对象不会支持其存储。它们只是上下文状态,或者在发出呈现调用之前可以设置为值的东西。请注意,这是提案早期迭代的一部分,但被放弃了。感谢您澄清,在使用原子计数器的分派/绘制之间,渲染过程之间不需要任何障碍-这很好,这也是进一步的信息,谢谢。但这仍然让我思考一个实际问题,例如,在第二次绘制中,是否最好将原子计数器声明为原子计数器,还是将其声明为SSBO中的另一个变量?