- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
60fps。 vsync什么时候强制程序等待?当您清除屏幕或翻转缓冲区时它会阻塞吗?还是我不知道的其他时间? 顺便说一句,我指的是 OpenGL-6ren">
假设我有一个非常快的程序,如果禁用垂直同步,它会运行 >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/
根据 ffmpeg 文档 -vsync parameter Video sync method. For compatibility reasons old values can be specifi
我正在尝试使我的窗口应用程序与显示器刷新垂直同步。此代码可在“fullscreen = true”(报告 75FPS,显示器刷新率)下正常工作,但在窗口模式下仅报告 32FPS。有人知道我在这里做错了
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
我正在决定是否将 VSync 用于我一直使用 OpenGL 开发的新游戏。目标是为用户提供最佳的游戏体验,并在性能和质量之间取得良好的平衡。该游戏设计为可在较旧的(Intel/上网本)计算机和较新的(
我正在用 C 语言制作一款适用于 linux 帧缓冲区的游戏。到目前为止,我有一个红色的 100x100 正方形,它与鼠标一起移动,就像指针一样。我已经实现了双缓冲并且它工作正常(方 block 不闪
当 vsync 不是一个选项时,与监视器刷新同步的首选方法是什么?我们启用了 vsync,但是,一些用户在驱动程序设置中将其禁用,并且这些用户会覆盖应用程序首选项。我们需要可靠的可预测帧长度来正确模拟
我正在寻找一种可移植方法来制作非阻塞 SwapBuffers(),即使 VSync 已激活。 换句话说,是否有可能收到事件通知或知道下一个 VSync 之前的延迟? 最佳答案 IIRC 此扩展可帮助:
我使用 UDP API 将相机源更新到 ImageSource,我有一个计时器更新 ViewModel 的 ImageSource,然后 WPF 数据绑定(bind)屏幕上的图像。 计时器的间隔时间与
在注意到我的游戏在构建到我的iOS设备上时非常不稳定时,我检查了事件探查器,发现vsync负责。经过一些研究,我发现为了解决游戏的抖动问题,我不得不将目标帧频设置为60,因为默认情况下将其设置为30。
我一直在研究游戏循环和物理。前几天,我添加了一些调试语句来查看我的游戏循环的每一帧花费了多少时间。正如预期的那样,结果在 16 毫秒范围内。但是,我尝试禁用 vsync,这些结果并没有改变。显然 vs
在我实现的 2D OpenGL 引擎中,我有一个固定的时间步长,如著名的 fix your timestep 中所述。文章,以及混合。 我有一个垂直移动的测试对象(y 轴)。运动中存在卡顿(预编程运动
我正在调查我的 Android 应用中的丢帧问题。它们是不规则的,平均每秒发生一次。我已将有问题的渲染器配对回一个非常简单的着色器,我相信帧渲染时间很短。 当我运行 systrace 时,我可以看到看
对于科学任务,屏幕上应显示具有稳定频率(最大 60 Hz)的闪烁区域。我尝试使用 Qt 5.6 实现稳定的刺激可视化。 根据这个blog entry和许多其他在线建议,我实现了三种不同的方法:继承自
我在同一个主线程中使用三个不同的 QGLWidgets,最好以 60fps 渲染,但我无法达到超过 20fps。这似乎是由 Vsync 引起的,因为每个小部件可能会尝试独立地与刷新率同步,因此它们会以
所以,我在窗口应用程序中使用 D3D。 我使用以下参数初始化 D3D: windowed: true; backbufferformat: D3DFMT_X8R8G8B8; presentinterv
对于我所有的 SDL/OpenGL 程序,帧速率都停留在 60fps,所以看起来 vsync 已启用,但不是由我,也不是在我的代码或我的设置中。所以我想现在是否有办法禁用它,也许在一些深层的 macO
使用时 AnimationController ,那vsync的目的是什么?范围? class Example extends StatefulWidget { @override _Exam
AnimationController 停止工作,因为不知何故 vsync 不再是命名参数。 这行代码停止工作。controller = AnimationController(duration: D
我目前正在为 Android 开发一款游戏,我想截取它的屏幕截图。我是在 eclipse 中使用 DDMS 工具这样做的。但是,大多数屏幕截图都是两帧的混合: ___________ |new fra
我正在使用 XWindow Drawable、Pixmap 和 XRender 在屏幕上绘制一些东西。我可以看到有时会出现闪烁。有没有办法等待VBLANK?我已经在谷歌上搜索了很多,感觉就像在森林里寻
我是一名优秀的程序员,十分优秀!