问题标签 [vsync]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
900 浏览

javascript - 画布垂直同步不起作用

我有一个使用 requestanimationframe 将绘图同步到监视器的 javascript/canvas 游戏。但是,当游戏滚动时我仍然会得到剪切效果(Windows 7 上的 Google Chrome)。有没有更好的方法来绘制到屏幕上?双缓冲?这就是我使用的:

您可以在这里看到问题:http ://www.pi-games.com/Thailet/

0 投票
2 回答
2260 浏览

c++ - Direct3D 12 窗口模式强制垂直同步

我正在编写一个简单的 Direct3D 12 应用程序来为 Vulkan 的发布做准备,它在所有方面都按预期工作,除了一个:在有边框的窗口中运行将帧速率限制为 60fps,即使禁用了 vsync。令我困惑的是:全屏窗口中的同一程序以近 4000 fps 的速度运行。

使用肮脏的自制分析器,我发现挂断发生在我的代码的这一部分,它一直等到最后一帧完成,然后才开始处理下一帧。

用于呈现渲染帧的代码很普通:

注意:第一段代码使用上述函数的返回值作为endFenceValue.

我正在使用的交换链是这样设置的:

对于那些感兴趣的人,我正在使用 SDL 创建窗口,但我自己编写WinMain并没有解决问题。我还尝试在 nVidia 控制面板中检查我的 vsync 设置,退出 fl.ux(但不卸载它),并在系统属性中更改我的性能设置。

任何人都可以为此提供解释或解决方案吗?

0 投票
1 回答
139 浏览

haskell - GPipe VSync & FPS

我开始学习GPipe 库,并且想知道如何使用它来完成 vsync 和 FPS 控制。最初,我认为一个单独的线程可以每1 * 1000000 / FPS微秒阻塞一次并运行swapContextBuffers,但这意味着单独的线程需要构建自己的ContextT,因此它是自己的窗口。

功能本身的文档简要提到,如果在系统中启用了 VSync,它可能会阻止- 这是什么意思?我将如何启用它?

0 投票
1 回答
371 浏览

android - 在 Android 上确定准确的屏幕翻转时间

我试图确定(在 1 毫秒内)Android 上发生特定屏幕翻转的时间。每次帧翻转时,Choreographer 都会触发,但无法确定实际显示的是哪一帧。根据https://source.android.com/devices/graphics/architecture.html,这个过程有好几层:用户登陆缓冲区,它翻转到一个三缓冲队列,它翻转到表面flinger,它翻转到硬件。这些层中的每一层都可能会丢帧,但此时我只确定了如何监控用户空间缓冲区。有没有办法监控其他缓冲区/翻转(实时,在无根、非自定义手机上)?

我在 HTC M8 上观察到了意外的帧延迟(大约每 5 分钟 1 次),但 Nexus 7 似乎没有这个问题。我使用带有照片传感器和实验室流层 ( https://github.com/sccn/labstreaminglayer ) 的 Cedrus StimTracker ( http://cedrus.com/stimtracker/ )来测量延迟。我尝试使用 eglPresentationTimeANDROID 来控制何时翻转屏幕,但这并没有解决问题。

请注意,我使用的是 ndk,但我通常可以在需要时使用 JNI 来访问非 ndk 功能。

我关心的原因是为了将 Android 用于心理和神经学实验,其中 1 毫秒的精度是非常可取的。

0 投票
1 回答
893 浏览

javascript - 使用 requestAnimationFrame 撕裂 HTML5 画布

更新:这整个问题最终成为系统图形驱动程序的问题,而不是(看似)浏览器/API问题。撕裂的框架归结为实际的显示更新。再次感谢那些参与讨论并试图提供帮助的人。


我的页面使用画布和 2d 上下文以 720p 显示预渲染帧。我正在单独渲染帧并使用新的 ImageData 更新变量。然后,在 requestAnimationFrame 中我只需执行context.putImageData(cached_image_data);. 尽管提前完全渲染了帧并有效地进行了双重缓冲,但我仍然经常撕裂。我在 SO 上发现了一些其他问题,但它们都以“使用 RAF”结尾。代码归结为:

如果不转向 webgl,我还能做些什么吗?

任何建议表示赞赏。泰所有 :D

0 投票
1 回答
365 浏览

android - 处理程序 postDelay 是否不精确

在我的应用程序中,我使用了 handle.postDealy(Runnable, 50) 来刷新我的视图。但有时它非常不精确。那是 90 毫秒。这是日志:

onRender 间隔:86

onRender 间隔:90

onRender 间隔:84

onRender 间隔:90

如何在android中获得精确的计时器?我可以使用 VSync 吗?

0 投票
0 回答
821 浏览

c++ - QOpenGLWidget 中的动画看起来很滞后

我没有写游戏的经验,这周我正在尝试用QT写一个音乐游戏地图的玩家(最终可能成为游戏?);遇到问题,我想我需要一些帮助。

我想在 QOpenGLWidget 上以 60 FPS 的速度显示动画。只是小部件中的一些圆圈移动,CPU使用率很低。但它看起来很滞后。

我通过将默认表面格式的交换行为设置为双缓冲区/三缓冲区来启用垂直同步,并且间隔为 1,我认为这意味着 60 FPS。
我实现了paintGL() 方法并通过QT 的2D 绘图示例所做的QPainter 绘制内容。
计算每个圆的位置的步骤放置在paintGL 方法之外,并且将在调用paintGL 之前运行。

这是程序运行的流程:

  1. 阅读脚本
  2. 启动计时器
  3. 发布事件以调用“tick”程序
  4. “tick”程序运行,并请求更新窗口。
  5. paintGL 运行,绘制框架
  6. 在退出paintGL方法之前,会发布一个调用“tick”的事件
  7. 我认为现在它等待 VSync 和交换缓冲区
  8. 调用“tick”,转到第 4 步

编码:

我尝试了这些方法来获取更多信息:

  1. 每次进入paintGL方法时通过qDebug()打印当前时间。
    似乎有时会掉帧;看起来很明显,距离上次调用的间隔超过30ms。
  2. 将鼠标移入/移出窗口持续时间动画。它变得滞后的可能性更高。
  3. 收集计算位置的时间成本,似乎只有很短的时间。
  4. 在android中运行这个程序,一样甚至更慢。
  5. 更复杂的游戏可以在我的电脑上流畅运行。我认为硬件足够快。(i7-4800M, GTX 765M)
  6. 一次又一次地重新启动程序。它现在很流畅(很少或没有发生丢帧),现在很迟钝......我找不到模式。

此外,将动画调整为 30 FPS,因为它看起来总是滞后。

我该如何处理这个问题?
(ps我希望它也可以在android上运行)

这是完整的源代码

https://github.com/sorayuki/CGSSPlayer/releases(cgssplayer.zip,不是源代码)
(我认为cgss-fumen.cpp对这个问题没有影响)

它可以构建在 QTCreator (5.6) 中,没有其他依赖项。

(对于 QT 5.5,它需要添加

进入 .pro 文件)

0 投票
1 回答
8337 浏览

c++ - 在 Vulkan 中启用 VSync

如何在 Vulkan 中使用 vsync?我在 Windows 上,但代码也应该在 Linux 上运行。它是通过插入栅栏来实现的vkAcquireNextImageKHR吗?

0 投票
0 回答
547 浏览

winapi - 使用 OpenGL 进行屏幕撕裂

我在 Windows 10 上使用 OpenGL 时遇到屏幕撕裂问题。。我正在做一个光线行进演示(仅在片段着色器中渲染 2 个三角形和光线行进和着色地形)。使用 GTX 860M 进行渲染,该应用程序在保持 60 FPS(至少在较低分辨率下)没有问题。但是存在屏幕撕裂(并且以下视频以特别低的分辨率渲染以确保这与片段着色器代码的复杂性无关): YouTube 上的屏幕撕裂视频。

我试过的:

我正在使用推荐的设置创建 OpenGL 上下文。我尝试使用 (wglSwapIntervalEXT(1)) 手动打开 VSync,尽管这应该是默认行为。我曾尝试在 SwapBuffers 调用之前放置 glFinish,即:

我尝试在 Nvidia 控制面板中将 VSync 设置为“始终开启”。我也尝试过使用 GLFW 而不是 WinApi 创建窗口。我尝试在全屏和可调整大小模式下创建窗口。

虽然我没有看到任何改善。

0 投票
1 回答
1123 浏览

c++ - Qt:vsync - 缺少渲染帧

对于科学任务,应在屏幕上显示具有稳定频率(最大 60 Hz)的闪烁区域。我尝试使用 Qt 5.6 实现稳定的刺激可视化。

根据这篇文和许多其他在线建议,我实现了三种不同的方法:继承自 QWindow 类、QOpenGLWindow 类和 QRasterWindow 类。我想获得 vsync 的优势并避免使用 QTimer。

可以显示闪烁区域。帧之间的稳定时间段也被测量为 16 到 17 毫秒。但是每隔几秒钟就会发现一些丢失的帧。可以非常清楚地看到,刺激没有稳定的可视化。相同的效果出现在所有三种方法上。

我是否正确地执行了我的代码或是否存在更好的解决方案?如果代码足以满足其目的,我是否必须假设这是硬件问题?那么,显示一个简单的闪烁区域有那么难吗?

非常感谢你帮助我!

作为示例,您可以在此处查看我的 QWindow 类代码:

被覆盖的事件函数调用的render()函数是: