问题标签 [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.
c++ - 关闭 VSync 但在我的 DirectX 9 应用程序中仍然获得 60FPS
我有一个 DirectX9 应用程序,它只在屏幕上渲染一个三角形,但无论我是否打开了 VSync,我都获得了 60 FPS 的帧速率。为什么是这样?
这是我为计算 FPS 所做的代码,但我不知道这是否是它的问题。
游戏计时器.h
游戏定时器.cpp
知道它只是屏幕上的一个三角形(没有绘制复杂的东西),如果我关闭 VSync,它应该每秒渲染超过 1000 帧,不是吗?
c++ - 以 20FPS 垂直同步窗口模式 opengl 游戏,直到 GDI 窗口变为最顶部
我的单线程双缓冲 Opengl 游戏使用 HWND、HDC 和 HGLRC 组合在两台显示器上运行。所以每个帧缓冲区的大小为 2560 x 1024。
我的电脑是:
Intel Core 2 Quad CPU @ 3.00GHz ATI Radeon HD 3400 系列 512MB VRAM DAC 400MHz 两台显示器均调至 60Hz 和 (1280 x 1024) 分辨率。
我看到我的关闭 vsyncing 的游戏以大约 36FPS 的速度运行。当 vsyncing 打开时,游戏同步到 20FPS,直到像任务管理器这样的 GDI 应用程序获得焦点并在其上渲染。然后我们看到游戏帧率上升到 30FPS,而任务管理器有焦点。FRAPS 确认我的配置帧率是准确的。
20FPS 是预期的垂直同步速率吗?我的印象是 60Hz 显示器的有效值是 60,30,15,10...?
我还设法敲出一个背景纹理演示,以与我的游戏相同的初始渲染器设置运行,我看到 Vsync 关闭时为 72FPS,而 Vsync ON 同步到 30FPS。同步到 60FPS 发生了什么?
就好像我错过了一个垂直同步中断或计时器,除非存在 GDI 窗口。
仅供参考,我正在使用 QueryPerformanceCounter 来获取高分辨率计时器来计算所有 FPS 计算。
c# - 在 WinForms 中强制 VSYnc 或限制 FPS - c#
我已经搜索但找不到不涉及 XNA 的结果。
基本上,我正在使用附加到表单中面板句柄的 SFML 的 C# 绑定来制作地图编辑器。它以 550 FPS 的速度运行,这导致我的主循环被调用太多,占用了太多资源(10% 的 CPU 用于小型地图编辑器)。
我真的只需要 60 fps,而且我知道这会导致 cpu 使用率下降很多。
有谁知道如何做到这一点?我听说这是不可能的,因为 WinForms 没有访问图形驱动程序 VSync 设置的功能;但一定有办法的,对吧?
谢谢。
pseudocode - 自定义垂直同步算法
在使用任何编程语言(可以)创建游戏时,重要的是有一个固定的目标帧速率,游戏将重绘屏幕,但是有些语言要么没有同步功能,要么计时器不可靠,所以有什么方法吗仅通过数学和/或通过休眠线程手动保持帧速率稳定?也许使用帧增量?
到目前为止,我只尝试过'sleep(targetframerate - (targetframerate-delta))' 这应该是意识到前一帧比目标花费的时间更长,所以然后通过更快地制作下一帧来进行补偿,但是它会影响自己并简单地杀死帧速率呈指数反向。
这些内置同步功能必须在这样的方法中使用某种数学来稳定帧速率。在 OpenGL 等高端 API 中是如何实现的?
android - need of vblank in Display subssytem
I am not clear on the use of the vertical blank (vblank) on display panels.
Could some one please explain
- Significance of vblank ?
- How it can be utilized in the display subsystem?
wpf - 我可以在 CompositionTarget.Rendering 中做什么?
CompositionTarget.Rendering事件是构建游戏主循环的完美之选。它基本上以垂直同步的速率(通常为 60 Hz)触发。
在合成树中的对象被渲染之前发生。在将动画和布局应用到合成树之后,Rendering 事件被路由到指定的事件处理程序。
每帧动画操作方法文章解释了更多。
请注意,您的事件处理程序方法是在计算布局后调用的。但是,您可以在事件处理程序方法中修改布局,这意味着在渲染之前将再次计算布局。
基于此,其处理程序内的代码规则是:
- 避免改变布局
- 快速返回
还有哪些其他问题?哪些不明显的动作会导致另一个布局传递?我在处理程序中究竟有多少时间?
python - 将 SwapBuffers() 与多个 OpenGL 画布和垂直同步一起使用?
我有一个使用 wxPython 编写的 GUI,其中包含两个GLCanvas
es,一个“显示”画布和一个“预览”画布,我正在使用 PyOpenGL 在其上绘制一些非常简单的几何图形。'preview' 和 'display' 画布显示相同帧缓冲区的内容:
我需要以一致的帧速率同步更新这两个画布而不会撕裂。
到目前为止,我一直在打电话
对于我的渲染循环中的预览和显示画布。如果我在我的驱动程序设置中禁用 vsync,这工作得相当好。
但是,如果我启用垂直同步,我的帧率会下降到 ~30Hz,我的显示器垂直刷新率的一半。大概这是因为渲染循环的执行在每次SwapBuffers()
调用时都停止等待下一次垂直刷新 - 如果我注释掉这两个SwapBuffers()
调用中的一个,我的帧率会回到 60Hz,但是当然只有我的一个画布得到更新.
我真正想要的是让我的两个画布同步更新,每个 vsync 间隔一次。有什么方法可以使用该wx.glcanvas.GLCanvas
课程来实现这一目标吗?
opengl - 是否可以 vsync SDL_SetVideoMode?
我正在尝试通过以下方式更改我的应用程序窗口的大小:
虽然我正在使用 vsync 交换缓冲区(在驱动程序 xorg-video-ati 中),但当窗口大小发生变化时,我可以看到闪烁(我猜是一个或多个黑框):
所以请有人知道,如果...
SDL_SetVideoMode 没有像 SDL_GL_SwapBuffers() 那样垂直同步?
还是它破坏了窗口并创建了另一个窗口,同时缓冲区是黑色的?
有人知道这样做的工作代码吗?也许在freeglut?
gtk - 使用 GdkFrameClock 将 GtkDrawingArea 与屏幕刷新率同步
背景
我想使用 将小部件的更新同步到屏幕刷新率GdkFrameClock
。这是用于 LCD 屏幕外的视觉刺激响应测量(因此需要尽可能接近精确的帧同步以保证信号的纯度)。
我已经阅读了该课程的文档,但范围有限;我缺少对 GdkFrameClock 在 GTK 世界中的地位的一些总体理解。仔细阅读 GitHub 上 GTK 源代码树中的演示对我来说毫无结果。
问题
假设我可以,我如何使用GdkFrameClock
将(假设开罗)的屏幕表示的更新同步GtkDrawingArea
到屏幕刷新率?
如果我不能,那目的是GdkFrameClock
什么?
opengl - 你怎么知道你显示的内容是完全绘制在屏幕上的?
在计算机显示器上显示图像涉及到图形 API 的使用,该 API 调度一系列异步调用......并在某个给定时间将所需的东西放在计算机屏幕上。
但是,如果您想知道在所需图像被完全绘制(并且对用户可见)时的确切CPU 时间怎么办?
当显示所有内容时,我真的需要获取 CPU 时间戳,以便将该时间点与我进行的其他测量相关联。
在不考虑图形堆栈的异步行为的情况下,很多事情都可以得到图形调用抖动的长度:
- 多线程;
- 同步到 V-BLANK(不幸的是,需要避免一些撕裂);
- 我还忘记了什么?:P
我针对 Linux 上的解决方案,但我对任何其他操作系统持开放态度。我已经研究了 X.org 服务器的部分xvideo 扩展和 OpenGL API,但我还没有找到有效的解决方案。
我只希望解决方案不涉及入侵视频驱动程序/硬件!
注意:我将无法在所需硬件上使用最近的 Nvidia G-SYNC 东西。虽然,这项技术会消除一些不可预测的抖动,但我认为它并不能完全解决这个问题。
OpenGL Wiki建议如下:“如果需要 GPU<->CPU 同步,则应在缓冲区交换后使用高精度/多媒体计时器而不是 glFinish。”
有人知道在 GPU 队列中的 swapBuffer 调用完成后如何正确地获取这样一个高精度/多媒体计时器值吗?