问题标签 [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 回答
3728 浏览

qt - Qt 5:禁用垂直同步

我想禁用vsyncQOpenGLContext 格式,以便于集成第三方渲染系统。

QSurfaceFormat::swapInterval似乎是 Qt 中唯一相关的参数。

我尝试了几种方法来实现这一点,但即使我QSurfaceFormat::swapInterval(0)在早期阶段(在QMainWindow构造之前)设置了,那么QOpenGLContext::create()调用正在恢复它。

有没有办法强制禁用 vsync?

0 投票
1 回答
5208 浏览

python - 在 Raspberry Pi 上使用 pygame 进行屏幕撕裂

我被困在屏幕撕裂问题上大约一个星期了。

这是我的问题:我想制作一个可以非常快速地显示一系列 PNG 图片的程序(以 30 fps 或更高的速度)。为此,我使用 pygame 库,尤其pygame.display.blitpygame.display.flip.

这是代码示例(带有自制延迟功能):

计时器允许我在屏幕上拥有相同的刷新率。我的问题是人们可以亲眼看到存在屏幕撕裂问题(https://en.wikipedia.org/wiki/Screen_tearing)。在 pygame 文档中,他们建议对屏幕初始化使用其他标志(pygame.HWSURFACE and pygame.DOUBLEBUFhttp://www.pygame.org/docs/ref/displayy.set_mode)。显然,这些可以帮助纠正屏幕撕裂问题。但是当我使用这些标志时,我看不到屏幕撕裂校正。

我在某处看到 pygame 无法在 X11 上处理 vsync,这可以解释为什么我认为 HWSURFACE 和 DOUBLEBUF 标志没有区别。

有人在 Raspberry Pi 上遇到过这个 vsync 问题吗?是否有要放入“config.txt”文件的参数?有没有人有办法获得真正的 vsync 信息来避免这些屏幕撕裂效果?

我已经看到 pyglet 可以在创建的窗口中处理 vsync,但由于未知原因,我无法在 pyglet 窗口中显示图像,而且我真的不确定它是否能解决问题,特别是如果 Raspberry 无法处理现在vsync。

0 投票
4 回答
2151 浏览

c++ - 如何在 Linux 中查询 Vsync 相位

我需要创建一个 C++ 函数,它将在下一个 Vsync 间隔之前的秒数作为浮点值返回。

为什么?

我正在创建显示跟随鼠标光标的矩形的程序。表面上,OpenGL 在 glXSwapBuffers 函数中提供了一个 vsync 机制,但我发现这并不可靠。使用一些卡驱动程序,您可以获得 vsync;与其他你没有的人。在某些情况下,您会获得垂直同步,但您也会获得额外的 2 帧延迟。

但这不是 OpenGL 中的错误。规范故意含糊不清:“后台缓冲区的内容然后变得未定义。更新通常发生在监视器的垂直回溯期间,而不是在调用 glXSwapBuffers 之后立即发生。” 关键字是“典型地”......基本上glXSwapBuffers 不承诺squat wrt vsync。去搞清楚。

在我目前解决这个基本问题的尝试中,我目前猜测初始 vsync 时间,然后假设相位等于经过时间 MOD 1/(59.85Hz),这似乎与我当前的监视器同步。但这并不好用,因为我实际上并不知道初始阶段。所以我得到一滴眼泪。至少它不会四处走动。但我真正需要的是以某种方式测量当前的垂直同步阶段。

不,我不想依赖一些 OpenGL 调用来为我做垂直同步。由于规范中的模糊性,这使得 OpenGL 实现可以根据需要添加尽可能多的延迟。

不,我不想依赖某些 SGI 扩展或必须安装的其他东西才能使其工作。这是图形 101。垂直同步。只需要一种查询其状态的方法。某些内置的、始终安装的 API 必须具有此功能。

也许我可以创建一个辅助线程以某种方式等待 Vsync,并记录发生这种情况的时间?但请注意以下顺序:

在 Debian 中不起作用。结果:

必须有某种方法可以从设备或其他 OpenGL 调用中读取相位。OpenGL是图形的东西。Vsync 是图形 101。

请帮忙。

0 投票
1 回答
1116 浏览

opengl - 如何禁用 SDL2 FPS 限制

我正在使用 SDL 2.0.4 和 GLEW 1.13.0,似乎 SDL2 中存在某种 fps 限制。我知道这一点,因为我做了一些时间测量。

更具体地说,我什么都不画,但如果我在主循环中调用 SDL_GL_SwapWindow(),每个循环大约需要 16 毫秒。如果没有这个电话,几乎不需要任何时间。当 SDL_GL_SwapWindow 是主循环中唯一的函数调用时,它甚至需要 16 毫秒。这意味着,必须在 SDL2 中启用某种 fps 限制或垂直同步。所以我的问题是:如何禁用上述限制?

我发现的唯一一个与我的问题有点相似的线程如下:SDL_GL_SwapWindow bad performance。但是这个线程中的答案对我并没有真正的帮助。此外,这似乎不是由我的计算机引起的,因为使用 FreeGLUT 完成的类似代码不会出现此问题。

所有文件的简要概述:

我的代码:

主文件

显示.cpp

显示.h

jtime.h

颜色.h

0 投票
0 回答
106 浏览

rendering - 使用 HaxeFlixel c++ 目标在运行时切换垂直同步

是否可以在运行时vsync为我的HaxeFlixel项目打开/关闭?或者我是否必须创建不同的可执行文件(一个启用 vsync,另一个vsync禁用)

在处理了一个IntelHD 错误之后,我不得不为我的 C++ 目标禁用 vsync,使用这个构建设置:

从游戏菜单中切换它会很好,所以我想知道是否有一个 API 可以vsync在运行时启用/禁用。

0 投票
2 回答
193 浏览

java - java - GC应用程序运行缓慢后

我有一个在 JVM 上运行的应用程序(游戏)。

游戏的更新逻辑(运行 60 次/秒)以大约 25% 的“时间片”(1/60 秒)使用完成,然后在剩余的 75% 中休眠。但是当 GC 收集器开始运行时,它会上升到 75-200% 并在其余的执行过程中停留在那里。

游戏使用大约 70Mb 的堆并增长大约 1-2mb/s。当 GC 运行时,它会回到 70Mb,因此没有真正的内存泄漏。我将来会尝试降低这个数字,但在这个范围内应该不是问题。

我正在使用没有运行时参数或标志的 JVM 8,不确定哪个 GC 会给我。

我尝试将堆设置为不同的大小,但这不会影响这种现象。

关于为什么会这样,我有两种理论:

  1. GC 无意中将我的堆碎片化,导致更新循环中的缓存垃圾。我的逻辑从数据接近性中受益匪浅,因为它循环并更新它。会不会是把一些数据洗牌到老区,而把一些数据留在年轻区(托儿所)?

  2. 突然的 GC 处理触发了我的操作系统,使其意识到我的主要更新进程不需要像当前那样多的 CPU 资源,从而降低了它的优先级。(但是,即使我跳过 thread.sleep() 以休眠未使用的 CPU 使用率,这种现象仍然存在。

你怎么看。我的理论是否合理,可以对它们做些什么,还是我需要切换到 C 语言?我对GC的了解有限。

PS 作为旁注,通常 update() 在 GC 后完成 75%。当我得到像 200% 这样的数字时,它是在使用 VSync 时。

0 投票
2 回答
2438 浏览

c++ - SDL/OpenGL 游戏在 144Hz 屏幕上运行太快;无法使用垂直同步

这就是我处理游戏循环的方式:

它旨在成为一个锁定到 60FPS 的固定时间步长游戏(它是对 SNES 游戏的重新模拟),但是它在我的 144hz 屏幕上以 144 个时间步长运行,这让它太快了。Vsync 不能解决这个问题,那有什么办法呢?

0 投票
0 回答
315 浏览

qt - QGraphicsView 与 QOpenGL 在英特尔集成显卡上闪烁

我有自己的类,它继承自 Qt5.6 QGraphcisView。

我还有一个 QGraphicsPixmapItem 在现场。(忘了说) ANGLE 已启用!

我经常更新像素图以制作像视频一样的动画。实际上它是视频,因为我为 QMediaPlayer 实现了自己的 QAbstractVideoSurface,并且我收到了在场景中更新的视频帧。

问题是在英特尔集成视频卡上,我看到动画闪烁,就像更新与显示 VSYNC 不同步。

在 NVIDIA 卡上似乎一切正常,没有问题。

我从 Qt 文档中读到,制作 fmt.setSwapInterval(2) 应该允许我在每 2 次 VSYNC 刷新时更新屏幕,所以我希望在 60Hz 显示器上有平滑的 30fps 动画。除此之外,似乎 setSwapInterval() 对英特尔和英伟达都没有任何作用:

在 Intel 卡上它总是闪烁,而在 NVIDIA 卡上它总是很流畅,不依赖于 swapInterval() 或任何其他 QGLFormat 选项。

我也尝试过,fmt.setDoubleBuffer(true);但在英特尔卡的情况下也无济于事。如何解决闪烁问题?

当然,我可以直接在场景中放置 QGraphicsVideoItem - 然后没关系,但我不能使用此选项,因为稍后我需要动态修改帧像素 - 为此我需要 QAbstractVideoSurface。

0 投票
1 回答
1454 浏览

c++ - Display image with qt & opengl, timing accuracy and vsync issues, c++

I'm building a module that is supposed to display images at a certain rate (not pre defined, but not very high - 10Hz max for the swapping of images).

From my research I got to the conclusion that QGLWidget is the right tool for this task, after enabling vsync with openGL calls(SwapInterval family).

Yet, I am not sure how to actually implement the swapping mechanisem - should I use a timer? If I set a timer for 333.3 ms(3 Hz), when the refresh rate is 60 Hz (16.67 per cycle, thus the timer is 20 cycles), and I be sure that timing will be fine? And if the rate should be 9Hz, I need to set the timer for 100+16.67 because this is the best I can get? And if a timer is ok, should I just call paintGL() when it sends me the timeout event?

Thanks

0 投票
2 回答
329 浏览

algorithm - 保持两个进程的内存数据结构同步

如何使内存中的数据结构在两个进程之间保持同步。两个进程是同一个进程(服务器)——一个是活动的,另一个是备用的。在活动的崩溃/或类似情况下,备用需要接管。为了让备用服务器接管活动服务器,内存中的数据结构需要保持同步。我可以使用虚拟同步吗?会有帮助吗?如果有我可以使用的图书馆吗?我在 Windows(Visual Studio)上使用 C++ 进行编码。

如果这不是解决方案,我可以参考什么好的解决方案?

TIA