虚拟同步在什么时候"wait"(块)?
At what point does vsync "wait" (block)?
假设我有一个非常快的程序,如果vsync被禁用,它将运行>60fps。什么时候vsync强制程序等待?当你清除屏幕或翻转缓冲区时,它会阻塞吗?还是我不知道的其他时间?
我指的是OpenGL,顺便说一下。
<
奖金问题/strong>
给定阻塞发生的特定点并不一定存在,我如何测量阻塞持续了多长时间?换句话说,我如何计算程序 运行的速度有多快?
对你的回答的评论表明,这仍然是一个有很多误解的话题。
长话短说:你的程序没有明确的阻塞点。
交换缓冲区调用立即返回。不相信我?编写一个程序,测量在单个交换缓冲区调用中花费的时间(即不进入渲染循环)。但我听到你说:如果我启用V-Sync并在我的程序中测量帧速率,它会显示正确的帧速率,所以它必须在某个地方阻塞。
发生的事情是,在调用交换缓冲区后,后缓冲区是一种"保护";后缓冲区将与调用SwapBuffers时的内容一起呈现在前缓冲区上。因此,下一个操作将在调用SwapBuffers之后更改后缓冲区块的内容,直到交换发生。
BUT(这是一个很大的但是)OpenGL命令队列是异步的。阻塞的是命令队列的执行,但除非插入同步点或队列最大容量已达到,否则所有OpenGL调用将立即返回。glFinish
引入一个同步点。但是如果你把glFinish放在SwapBuffers之后,因为它只作用于在它自己和之前的SwapBuffers之间发生的任何绘图操作,所以还没有什么要完成的,它很可能会立即返回。
所以你在渲染循环中测量SwapBuffers
的时间,突然它需要一个V-Sync间隔返回。这是怎么呢SwapBuffers
意味着glFlush
。但更重要的是,缓冲区交换使回缓冲区处于未定义状态,这意味着缓冲区交换操作与绘制命令处于缓冲区内容修改的同一级别。但是,如果已经有一个缓冲区交换队列,则只有两个缓冲区(前缓冲区和后缓冲区),因此下面的缓冲区将调用同步块,直到执行前一个交换。这会拖延命令队列,最终生成一个OpenGL绘图命令或SwapBuffers命令块。
- 什么时候调用组成单元对象的析构函数
- 什么时候在C++中返回常量引用是个好主意
- 什么时候调用析构函数
- boost odeint什么时候真正调用观测者
- 编译器对数组声明大小的计算。什么时候发生?
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 您应该在什么时候创建自己的异常类型
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 什么时候可以使用常量装饰调用我的重载函数?
- unordered_map什么时候返回 -1?
- QCoreApplication什么时候有效?
- sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候会有所不同?
- 什么时候用指针调用C++类构造函数
- 我不明白在这个例子中什么时候调用构造函数
- 如果真的需要std::move,我们应该什么时候声明右值refs
- P1008("prohibit aggregates with user-declared constructors")在实践中什么时候有用?
- 程序什么时候会创建多个堆
- 调用boost.asio的异步函数时,线程是什么时候创建的
- Swig/python : 什么时候需要 SWIG_init() ?
- 虚拟同步在什么时候"wait"(块)?