问题标签 [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 投票
0 回答
1162 浏览

opengl - GLFW 垂直同步问题

我对 GLFW 库和 VSync 有一点小问题。我正在我的集成处理器和“高性能 NVIDIA 处理器”上测试一个非常基本的 GLFW 程序。

当使用 VSync 调用在集成处理器上运行程序时glfwSwapInterval(1),我得到了大约 16 毫秒/帧(~60 FPS),正如预期的那样。但是,当在 NVIDIA 处理器上使用相同的 VSync 调用运行相同的程序时,帧速率会下降到大约 30 毫秒/帧(~30 FPS)。我尝试在没有glfwSwapInterval调用的情况下测试程序,它在集成处理器上运行时表现如预期(小于 1 毫秒/帧)。当我在 NVIDIA 处理器上进行测试时,我得到了大约 24 毫秒/帧,这绝对是不正确的。使用 call 运行程序时glfwSwapInterval(0),两个处理器都按预期以低于 1 毫秒/帧的速度运行。

起初我想这可能是一个 GLFW 问题,但我不太确定了。我检查了 NVIDIA 处理器的设置,他们说 VSync 选项由应用程序控制,应该是这样。

同样,这是一个基本的 GLFW 程序,没有任何绘制调用。任何对可能导致该问题的原因的见解将不胜感激。如果需要,我可以提供更多信息。

0 投票
0 回答
255 浏览

opengl - 导致屏幕撕裂或卡顿最可靠的效果是什么?

我正在尝试研究减少或消除屏幕撕裂的各种策略,例如各种 vsync 实现、手动帧速率计时、双缓冲等。我计划创建一个教程或论文来解释我的发现。

但是,首先,我需要创建一个简单的 opengl 程序来演示效果,这样我就会知道各种策略的效果如何。哪些类型的动画和效果最容易产生撕裂?我知道快速移动通常会触发它,但我假设我可以使用某种方程式或经验法则。

我试过用谷歌搜索,但我只能找到关于如何停止撕裂的无穷无尽的线索,没有有条不紊的方法来创建它。

0 投票
3 回答
2031 浏览

opengl - 在 glfwSwapBuffers 方法中检查我们是否需要休眠

我正在尝试使用 glew 和 glfw 创建示例应用程序。主循环很简单,看起来像:

问题是由于 vsync 当前线程在 glfwSwapBuffers 执行中休眠(fps 限制为 60 fps)。我正在寻找一种方法来利用这段时间来连续执行 someUsefullMath 方法。理想情况下,代码必须类似于:

有办法吗?

0 投票
1 回答
179 浏览

c# - vsync 脉冲上的精确软件同步

我正在尝试在每个传入的垂直同步脉冲上切换图像。在硬件中,我的 vga 信号的 vsync 脉冲可以很容易地通过对输入脉冲(VHDL)的每个边缘事件使用触发器来使用。

现在我的问题是:是否可以在软件中触发和交换此 vsync 信号上的图像,在 windows 环境中更可取?因此,每次屏幕刷新迭代都会交换到另一个图像。欢迎任何语言,程序。这种触发必须尽可能准确.. ( < 1 ms)

谢谢!

0 投票
0 回答
2446 浏览

android - Android 动画:跟上 vsync

免费

我正在为尚未定义的硬件平台(目前正在测试 Ouya 和 MK802IV,所有 Android 4.1+)开发一个基于 Android 的应用程序,其中涉及将各种内容显示到 1080p@60HZ 输出(大屏幕)。

该应用程序涉及显示滚动条,即在屏幕上从右到左滚动的一段文本(如在电视新闻台上看到的那样)。我确实有一个工作实现(扩展 SurfaceView 和手动绘图),可以在 60fps 下完美运行。

问题

当应用程序的其余部分开始执行更高级的片段动画并且滚动的帧率下降时。对我来说,这种下降是完全正常的(即使在优化之后),但是即使帧速率下降到 30-40fps,我也希望滚动保持其原始速度和平滑度。这非常重要,因为移动文本的平滑度对用户来说非常明显。

我已经阅读了有关 Android 4.1+ 中使用的 Vsync 和 tipple 缓冲的信息,据我所知,有两种可行的解决方案:

解决方案 1:较慢的 VSYNC

对于整个应用程序或设备,将 Vsync 全局降低到 ~30fps 会很棒。不幸的是 eglSwapInterval 不适用于任何经过测试的设备。

  • 有没有办法强制整个应用程序/设备以恒定的较低帧速率呈现?

解决方案 2:知道我在渲染什么帧

由于设备具有 Android 4.1+,我的 SurfaceView 被渲染为三重缓冲方案的一部分,现在如果我的实现以某种方式知道它正在渲染什么帧,它可以相应地绘制滚动文本,尤其是子像素绘制不是问题。

我尝试过使用 SystemClock.uptimeMillis 的简单实现,但是以这种方式获得的时间戳波动太大(即使在 60fps 时,帧之间的时间增量也远非恒定)。

  • 有没有办法知道我正在渲染哪一帧或跳过了多少帧,所以我可以使用这些信息来正确渲染帧?

  • 对于如何处理文本滚动的主题,您还有其他建议吗?

附加信息

请记住,文本可能很长(1000 个字符+),以~20 个字符/屏幕显示,~4 像素/秒到 1920x280px 小部件,字体不是等宽的。我曾想过使用 OpenGL 和 GlSurfaceView,但是这里的问题仍然存在,在高系统负载期间,我仍然需要知道,我目前正在渲染什么。

依赖于平台的解决方案也非常受欢迎,因为我将控制可以支持的平台(可能是一个非常狭窄且不是主流的范围)。

预先感谢您的帮助。

0 投票
0 回答
237 浏览

python - 如何在 OS X 上使用 Kivy 启用 Vsync

我开始学习 Kivy,在构建 Pong 教程应用程序后,我看到球重绘时疯狂撕裂,显然是因为图形更新与垂直刷新率不同步。

反正有没有实现这样的同步?

0 投票
1 回答
1236 浏览

java - 为什么 Java 在新 PC 上绘图缓慢?- 垂直同步?

在一台新 PC(Core i7-4820K 3.7 GHz、Asus P9X79 LE、GeForce GTX 650、Windows 8.1 和 Ubuntu 14.04)上运行 Java 绘图基准测试似乎可以通过带有 Java RTE 1.7.0_65 的 Windows 以大约 60 FPS 的速度运行。然后,有一次,根据其他 PC 上的速度,以预期的 400+ FPS 运行。现在它又回到了 60 FPS。在最轻量级的测试中,CPU 利用率几乎为 0%,而 GPU 小于 10%。新的图形驱动程序没有任何区别。相同的类文件通过 Ubuntu 和 linux java 1.7.0_55 获得 400 FPS,并且使用 JDK 6 或 7 编译没有区别。

下面是没有加载、计算和显示图像的函数的代码。这在较旧的稍慢的 Win 7 PC 上获得了近 600 FPS,但在新 PC 上再次获得了 60 FPS。通过 HTML 小程序在线运行的代码变体以 400+ FPS 运行。有人有解释吗?

我尝试了许多“线程安全”示例,试图在新 PC 上获得更快的 FPS 速度,但均未成功。最后一个只是刷新没有图形的空白屏幕。我注意到测得的 FPS 通常高达 65 FPS,这表明它可能不是强制 VSYNC。这导致怀疑 Swing Timer,我发现它可以按照以下所示进行校准,其中还包括睡眠、等待、currentTimeMillis 和 nanoTime。

http://www.java2s.com/Code/Java/Swing-JFC/TimeResolution.htm

以下产生 Swing Timer 测量:

以下显示了产生快速 FPS 的 PC 的结果和新 PC 的第二个结果。睡眠时间为零时,另一台 PC 产生 0.11 毫秒,新的 PC 产生 15.66 毫秒,相当于接近 64 FPS,之前的限制为 9091 FPS。

有谁知道是否可以强制最低 Swing Timer 分辨率?

0 投票
1 回答
2188 浏览

android - 使用 OpenGL ES 2.0 在 Android 中进行双缓冲页面翻转

从 Froyo 及更高版本开始,我可以安全地接近 Android 设备的图形硬件吗?

我想在 Android 设备上实现一个简单的页面翻转方案,使用两个帧缓冲区。

它应该是这样的:

  1. 渲染到帧缓冲区 A。(帧缓冲区 A 是后台缓冲区,当前显示帧缓冲区 B。)

  2. 等待下一个 VSYNC(可能是 VSYNC 中断?)

  3. 告诉操作系统显示帧缓冲区 A 并使帧缓冲区 B 成为后台缓冲区。

  4. 渲染到帧缓冲区 B。(帧缓冲区 B 是后台缓冲区,当前显示帧缓冲区 A。)

  5. 等待下一个 VSYNC(可能是 VSYNC 中断?)

  6. 告诉操作系统显示帧缓冲区 B 并使帧缓冲区 A 成为后台缓冲区。

重复步骤 1 - 6。

每秒更新大约 15 到 25 次显示器最适合我的需要。(我永远不需要 60 fps 或任何高于 30 fps 的速度。)

我打算只使用 OpenGL ES 2.0 进行所有渲染。

0 投票
1 回答
67 浏览

firefox-os - Firefox OS 是否同步显示平台和内核?

有人可以帮助我了解平台和内核之间的显示速率是如何同步的。因为我看不到 vsync 的使用,就像我们以前在 Android 中所做的那样?

所以我想知道firefox os是如何做到的?

0 投票
2 回答
3109 浏览

opengl - glXSwapBuffers() 阻塞直到 vblank

在尝试使用 OpenGL 作为后端为 X11 制作合成窗口管理器时,我陷入了一种令人讨厌的情况,即 glXSwapBuffers() 阻塞,直到 vblank 渲染合成器对 X 事件无响应,这导致窗口被拖动到大致落后于光标一帧。我尝试过多线程,但效果不佳,所以我决定唯一合适的解决方案是使 glXSwapBuffers() 异步。最好将绘图命令发送到 GPU 并立即返回,而无需等待操作实际完成,而 AFAIK 这在具有 DRI2 的现代 Linux 下是可能的。所以我该怎么做?