60fps。 vsync什么时候强制程序等待?当您清除屏幕或翻转缓冲区时它会阻塞吗?还是我不知道的其他时间? 顺便说一句,我指的是 OpenGL-6ren">
gpt4 book ai didi

c++ - vsync "wait"(阻塞)在什么时候发生?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:45 29 4
gpt4 key购买 nike

假设我有一个非常快的程序,如果禁用垂直同步,它会运行 >60fps。 vsync什么时候强制程序等待?当您清除屏幕或翻转缓冲区时它会阻塞吗?还是我不知道的其他时间?

顺便说一句,我指的是 OpenGL。


奖励问题

鉴于阻塞发生的时间点不一定是特定的,我将如何衡量阻塞所花费的时间?换句话说,我如何计算出程序可以运行多快?

最佳答案

对您的回答的评论表明,这仍然是一个存在很多误解的话题。

长话短说:您的程序没有明确的阻塞点。

交换缓冲区调用立即返回。不相信我?编写一个程序来测量在单个交换缓冲区调用中花费的时间(即不进入渲染循环)。但我听到你说:如果我启用 V-Sync 并在我的程序中测量帧速率,它会显示正确的帧速率,因此它必须在某处进行阻塞。

发生的事情是,在调用交换缓冲区之后,后台缓冲区有点“ protected ”;后台缓冲区将与调用 SwapBuffers 时的内容一起呈现在前台缓冲区上。因此,在调用 SwapBuffers 之后,将改变后台缓冲区内容的下一个操作会阻塞,直到交换发生。

但是(这是一个很大的但是)OpenGL 命令队列是异步的。阻塞的是命令队列的执行,但是除非插入了一个同步点或者队列的最大容量已经达到,否则所有的OpenGL调用都会立即返回。 glFinish 引入了一个同步点。但是,如果您将 glFinish 紧跟在 SwapBuffers 之后,因为它只作用于它自己和之前的 SwapBuffers 之间发生的任何绘图操作,所以还没有什么要完成的,它也可能会立即返回。

因此,您处于渲染循环中并在那里测量 SwapBuffers 的时间,突然间需要一个 V-Sync 间隔才能返回。这是怎么回事?好吧,SwapBuffers 意味着 glFlush。但更重要的是,缓冲区交换使后台缓冲区处于未定义状态,这意味着缓冲区交换操作与绘图命令处于同一级别的缓冲区内容修改。但是因为如果已经有缓冲区交换排队,则只有两个缓冲区(前面和后面),所以下一个缓冲区调用同步块(synchronized block),直到执行了前一个交换。这会拖延命令队列并最终生成一个 OpenGL 绘图命令或 SwapBuffers 命令 block 。

关于c++ - vsync "wait"(阻塞)在什么时候发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24135853/

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