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

c# - 使用或不使用 VSync

我正在决定是否将 VSync 用于我一直在使用 OpenGL 开发的新游戏。目标是为用户提供最佳的游戏体验,并在性能和质量之间取得良好的平衡。该游戏设计用于在较旧的(英特尔/上网本)计算机和较新的(NVidia/i7 台式机)计算机上运行。但是,我知道 VSync 的目的是防止撕裂;即使关闭了垂直同步,我也无法重现这个撕裂问题。提供最佳体验;应该打开还是关闭 VSync?

0 投票
2 回答
4996 浏览

html - 如何在 HTML5 画布上获取 vsync 回调?

如何在 HTML5 画布上垂直同步回调

0 投票
1 回答
2371 浏览

wpf - wpf 等待 vsync(图片)

我使用 UDP API 将相机源更新到 ImageSource,我有一个计时器来更新 ViewModel 的 ImageSource,然后 WPF 数据绑定屏幕上的图像。

计时器的间隔时间与刷新率一样多,但这并不意味着它与屏幕更新同步,所以我很伤心。

使用 SlimDX、XNA opengl 等很容易同步到刷新率,我应该如何使用 WPF 解决它?

0 投票
4 回答
3133 浏览

c++ - Direct3D 11 缺少 GetRasterStatus,如何检测垂直空白期?

我正在更新一个应用程序,在该应用程序中,测量屏幕上刺激呈现的时间需要最高精度。它目前是用 DirectDraw 编写的,很久以前就被淘汰了,需要更新我们的图形库。

我们测量呈现时间的方法是利用检测垂直空白期的结束。具体来说,我需要尽可能准确地知道,当翻转到主表面(或显示在交换链中)的任何内容实际上被屏幕绘制时。检测扫描线可以增加该测量的确定性,但我只能检测在调用 Flip 或 Present 后垂直空白周期何时结束。

Direct 3D 9 具有IDirect3DDevice9::GetRasterStatus 方法,该方法返回一个 D3DRASTER_STATUS 结构,其中包括一个 InVBlank 布尔值,用于描述设备是否处于垂直空白以及当前扫描线。DirectDraw 具有类似的功能(IDirectDraw::GetVerticalBlankStatus,以及在垂直空白期间返回 DDERR_VERTICALBLANKINPROGRESS 的 IDirectDraw::GetScanLine 可用于检测 VB)。

但是我在 Direct3D11 中找不到任何类似的功能。有谁知道此功能是否在 Direct3D9 和 Direct3D11 之间移动或删除,如果是后者,为什么?

0 投票
2 回答
1771 浏览

android - 60Hz 的动画效果如何?

我正在使用 Thread 在 Android 下进行滚动。线程运行方法是经典的。我在 Internet 上拿了它我的视图是 SurfaceView。

我不明白的是:为什么 doDraw (将在屏幕上绘制)每秒准确调用 60 次?为什么没有同步问题?

我不知道 LCD 是如何工作的,但是在屏幕上,如果您在不等待屏幕同步的情况下进行滚动,则屏幕顶部可能会显示上一个图像,而底部会显示正确的图像。我在Android上没有问题。

是处理一种双缓冲的 SurfaceView 吗?如果是这种情况,何时完成翻转?

我在互联网上没有找到任何相关信息!

谢谢艾蒂安

0 投票
0 回答
2191 浏览

android - Android GLSurfaceView ~56fps - 如何控制交换?

运行基本示例时: http ://android-developers.blogspot.com/2009/04/introducing-glsurfaceview.html

使用 System.currentTimeMillis() 添加一些基本计时,或者使用本机代码并使用 clock_gettime(CLOCK_REALTIME_HR, &res) 两者都会产生相同的结果。我分别测试了两者。

我总是计算约 56 的帧速率。这是帧之间 18 毫秒的粗略平均值。我意识到帧的计时并不是一门完美的科学(计时器的准确性,设备在后台做事)。我只是让它运行,什么都不做,甚至没有 glClear。一个小时后,这是我得到的结果,这与让它运行 1 分钟大致相同。

我尝试了很多方法来实现真正的 59/60fps。我开始怀疑它是否是我的设备(HTC Incredible S)。虽然我尝试过三星 Galaxy S 和 Nexus S,但结果相同。平板电脑根本不会表现出这种行为。在我的 EEE Transformer 和 Xoom 上,我始终可以得到大约 16 毫秒的帧。

这让我相信 VSYNC 是问题所在,并且那一代 Android 手机上的 vsync 很慢。真正的 VSYNC 应该是 ~16ms。实现真正的 60fps 不太可能,但 59fps 应该很常见。

有没有其他人经历过这个?禁用垂直同步的任何提示?我不认为这是可能的。有什么技巧可以控制渲染的“交换”步骤吗?

0 投票
2 回答
2061 浏览

windows - 将多个 OpenGL 窗口同步到 vsync

在 Windows 应用程序中,我同时打开了多个 OpenGL 窗口。理想情况下,我希望每个都以 60 fps 的速度绘制,与屏幕刷新同步。

对于每个渲染上下文,我都会调用wglSwapIntervalEXT(1)以打开 vsync。每个窗口都有自己的显示线程,它绘制框架然后调用SwapBuffers更新。

事实证明,这些窗口正在相互“战斗”:看起来SwapBuffers调用是同步的并相互等待,即使它们位于不同的线程中。我正在测量每个窗口的帧到帧时间,并且有两个窗口,这下降到 30 fps,3 到 20 fps 等。

如果我用 关闭垂直同步wglSwapIntervalEXT(0),无论我打开多少个窗口,它们都会愉快地以 60 fps 刷新。但是在打开一个窗口的情况下,这并不像打开 vsync 那样平滑。

有什么方法可以用 OpenGL 完成我想要的吗?

0 投票
6 回答
5458 浏览

opengl - 每个垂直同步如何准确地进行一次渲染(不重复,不跳过)?

我正在尝试进行垂直同步渲染,以便每次垂直同步完成一次渲染,而不会跳过或重复任何帧。我需要它在 Windows 7 和(将来)Windows 8 下工作。

它基本上包括绘制QUADS适合屏幕的序列,以便原始图像中的像素与屏幕上的像素 1:1 匹配。无论是使用 OpenGL 还是 DirectX,渲染部分都不是问题。问题是正确的同步。

我以前尝试使用带有WGL_EXT_swap_control扩展名的 OpenGL,通过绘制然后调用

我尝试了这两条指令的所有组合和排列以及 glFlush(),但它并不可靠。

然后我尝试使用 Direct3D 10,通过绘图然后调用

其中g_pSwapChaina是IDXGISwapChain*与该 SwapChain 关联的。pOutputIDXGIOutput*

OpenGL 和 Direct3D 这两个版本的结果是一样的:第一个序列,比如 60 帧,并没有持续应有的时间(而不是在 60hz 下大约 1000 毫秒,而是持续大约 1030 或 1050 毫秒),以下的似乎工作正常(大约 1000.40 毫秒),但它似乎时不时地跳过一帧。我用 进行测量QueryPerformanceCounter

在 Direct3D 上,仅尝试 WaitForVBlank 循环,1000 次迭代的持续时间始终为 1000.40,几乎没有变化。

所以这里的麻烦是不知道每个调用的函数何时返回,以及交换是否在垂直同步期间完成(不是更早,以避免撕裂)。

理想情况下(如果我没记错的话),要实现我想要的,应该是执行一次渲染,等到同步开始,在同步期间交换,然后等到同步完成。如何使用 OpenGL 或 DirectX 做到这一点?

编辑:只有 60 倍 的测试循环WaitForVSync需要从 1000.30 毫秒到 1000.50 毫秒。Present(1,0)与before相同的循环WaitForVSync,没有其他内容,没有渲染,花费相同的时间,但有时它会失败并花费 1017 毫秒,就好像重复了一帧一样。没有渲染,所以这里有问题。

0 投票
1 回答
753 浏览

windows - Windows 的 CVDisplayLink 替代品?

在 Mac OS X 上,CVDisplayLink提供了一种可靠地更新屏幕以实现 60 fps 动画而不会撕裂的好方法。Windows上是否有类似的界面,兼容OpenGL?

在等待垂直同步时当然可以阻塞,但这不适用于需要同时动画的多个窗口。在 Windows 上,它们都将相互等待(因此两个等待垂直同步的窗口将下降到 30 fps),这与 OS X 不同。

例如,视频播放器如何实现平滑的屏幕更新?

0 投票
2 回答
2411 浏览

c# - 无论如何都知道屏幕何时更新/刷新(可能是OpenGL或DirectX?)

我目前有一个我正在用c#(使用.NET)编写的应用程序,它要求我在用户看到屏幕上的图像时立即启动一个计时器,直到他们按下按键。

现在我意识到,考虑到显示器输入延迟和响应时间、键盘物理发送消息所需的时间、操作系统处理它等,这实际上是非常困难的。

但我正在尽我最大的努力将其减少到主要是一个恒定的错误(响应时间结果将用于将一个用户与下一个用户进行比较,因此恒定的错误并不是真正的问题)。然而令人讨厌的障碍是由显示器刷新率引起的变量,正如我在调用和完成我的 onPaint 消息时所收集的那样,这并不意味着图像实际上已被处理并从图形缓冲区发送?

不幸的是,时间限制和其他承诺实际上会限制我在 c# for windows 中继续这项任务。

所以我想知道是否可以在 OpenGL 或 DirectX 中处理所有绘图,或者如果可以在屏幕更新时仅使用 OpenGL 或 DirectX 创建事件,对我来说更好吗?

之前给我的另一个建议是关于垂直同步,如果我关闭它,图像一绘制就发送?而不是以与显示器刷新率同步的设定速率发送图像?