问题标签 [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.
java - 如何修复 Slick 游戏中的闪烁屏幕?
我正在使用Slick库编写一个简单的类似马里奥的游戏,但我遇到了游戏窗口闪烁的问题。我通常在它下面有一个 Eclipse 窗口,在我看来,当 Eclipse 更新它的屏幕时,我的游戏上会出现一些东西。
当我开始游戏时,它显示:
我在联想 Thinkpad x100e 上使用 Ubuntu 10.04。我注意到这不会发生在我的朋友身上,所以我想这可能是驱动程序(flgrx)或窗口管理器(metacity)的问题,但我不知道如何检查才能确定。或者也许它与vsync有关?
有任何想法吗?提前致谢 :)
java - 窗口化 Java 应用程序中的垂直同步
我一直在破解 Notch 的 Ludum Dare 22 条目Minicraft。这是一款用 Java 编写的 2D 动作冒险游戏。虽然游戏在我的笔记本电脑上以 150-200 FPS 的速度运行,但画面撕裂非常明显。我想解决这个问题。
我有多年的编程经验,还有一些游戏编程经验,但我对 Java 完全陌生。根据我的阅读,(窗口)Java 应用程序中的 V-sync 过去一直是个问题。今天有可能吗?有实用的解决方法吗?
到目前为止,我已经尝试过java.awt.Toolkit.sync(),但它似乎没有帮助。我还确定 Minicraft 已经是三重缓冲的。
在我花太多时间在这之前,我想知道我是否走上了一条死胡同。如果需要,我很乐意提供更多技术信息。
编辑:对于它的价值,我在 Mac 上。我只是试图捕捉撕裂效果的屏幕录制,但显然在 QuickTime 录制时,游戏是垂直同步的!这有什么意义?这是操作系统问题而不是 Java 问题吗?
macos - 如何在 macOS 上禁用垂直同步
对于我所有的 SDL/OpenGL 程序,帧速率都停留在 60fps,所以看起来垂直同步已启用,但不是由我启用,也不是在我的代码或我的设置中。所以我现在想如果有办法禁用它,也许在一些深层的 macOS 设置中?
macos - 在 OS X 中全屏使用 OpenGL 的稳定 60hz 帧速率是否可能?
我正在尝试编写一个应用程序来全屏显示视频,该视频需要尽可能流畅。
我的 OpenGL 代码与垂直刷新同步同步,并且大部分时间播放流畅且 CPU 使用率低。
但是,有时会有轻微的口吃。
为了简化测试并消除潜在的延迟源,我编写了一个简单的渲染循环,它只创建一个全屏、清除帧并交换缓冲区。
我对缓冲区交换时间进行了计时(使用 mach_absolute_time() )并打印了 15 到 18 毫秒范围之外的时间。
下面显示了一个示例运行(报告时间以秒为单位,帧时间以毫秒为单位):
在测试时没有其他应用程序从 XCode 运行 appart。测试在运行 OS X 10.7.5 的 Macbook Pro 5,1 上运行。
切换图形(这台笔记本电脑有 Nvidia 9600 和 9400),从外接显示器或笔记本电脑屏幕运行没有区别。
为了排除底层 API 之间的差异,我使用 SDL、Glfw、Cinder 和 SFML 等图形框架尝试了相同的代码。最后,我还尝试了官方 Apple OpenGL 全屏示例的计时。它们的行为或多或少都相同,尽管 Glfw 似乎更稳定一些。
使用 SCHED_FIFO 策略将绘图线程优先级提高到最大值似乎可以改善一点,但效果不大。
我开始认为不可能从 OpenGL 获得稳定的 60hz 帧速率,或者如果是,那么它没有正确记录。
有没有人能够在 OS X 中为全屏 OpenGL 应用程序获得稳定的 60hz 显示速率?如何?
编辑:我注意到从终端运行测试极大地改善了时间。从 XCode 运行会产生更多的波动,我正在使用这些数字来得出我的结论。无论如何,我似乎仍然在同一台机器上的 Windows 7 下获得更稳定的行为。但电流波动在容许要求之内。
directx - 禁用 DWM 的窗口模式下的 Direct3D 10 垂直同步问题
在禁用 DWM 的窗口模式下,Direct3D 10 上的 vsync 出现问题。
我们有一个应用程序,它呈现并呈现一些输出。它必须在窗口模式下工作,并且必须至少产生稳定的 60 fps。一个版本的应用程序使用 Direct3D 9 和另一个 Direct3D 10。当我们在窗口模式下工作时,有时我们会降低 fps(它不是“稳定”降低。在大多数情况下,我们产生稳定的 60 fps,有时它会突然降低几秒钟,然后恢复到 60 fps)。在这两个版本的应用程序中,fps 降低约为 10-20 fps。这是不可接受的。
在 Windows Vista 和 Windows 7 中,有新的图形系统,称为“桌面合成”,它改变了应用程序在屏幕上显示像素的方式。桌面合成由桌面窗口管理器 (DWM) 执行。您知道,当启用 DWM 时,应用程序会绘制到显存中的屏幕外表面,而不是由 DWM 渲染并在一段时间内呈现在显示器上。因此,我们注意到,当任务管理器中的 dwm.exe 不执行任何操作(处理时间约为 0%)时,我们的 fps 会降低,而当 dwm.exe 占用 1-3% 的处理时间时,会有稳定的 60 fps 并且一切正常好的。
我们无法影响它。因此,我们必须关闭 DWM 才能获得高稳定的 fps。当我们关闭它时,一切正常。两个版本的应用程序都有稳定的 60 fps。但是DWM是在窗口模式下做vsync的,所以当我们关闭它的时候,我们必须自己做vsync。
但是当我们关闭 DWM 时,Direct3D 10 在窗口模式下的 vsync 会出现问题。显示器顶部有图像撕裂。Direc3D 9 一直运行良好。
因此,我们有一台刷新率为 60 Hz 的显示器。
在创建交换链时,我们设置了这样的参数:
在演示时,我们设置了一个标志来打开 vsync:
并有下一个垂直同步问题。有垂直线,从左侧快速移动到右侧。并且显示器顶部有图像撕裂。
http://bit.ly/POQoFq
起初我们认为,我们做错了什么。所以我用旋转立方体安装了微软的示例“Tutorial 07: Texture Mapping and Constant Buffers”。使立方体更大,将其放置得更高,使其旋转更快并遇到相同的问题(见图)。
http://bit.ly/SevNqw
http://bit.ly/RSoEhc
http://bit.ly/UjaNPu
因此,在全屏模式下的 Direct3D 10 上一切正常。垂直同步完美运行。在 Direct3D 9 上也一切正常,在禁用或启用 DWM 的情况下,vsync 效果很好。在禁用 DWM 的窗口模式下的 Direct3D 10 上存在问题。
它在不同的计算机、不同的显卡(Nvidia 8600 GT、Nvidia 9500 GT、ATI Radeon HD 5870 Eyefinity 6)和不同版本的驱动程序上进行了测试。问题稳定重现。我们使用的是 Windows 7。
那么,为什么会出现这样的问题呢?如何解决它以及下一步该怎么做?
UPD1。如果上面的图像不可用,则有一些镜子。
https://dl.dropbox.com/u/20468014/DSC_2287.JPG
https://dl.dropbox.com/u/20468014/DSC_2308.JPG
https://dl.dropbox.com/u/20468014/DSC_2313。 JPG
https://dl.dropbox.com/u/20468014/DSC_2319.JPG
UDP2。我还想注意,我正在创建带有标志 WS_POPUP 的窗口以隐藏标题栏(它必须被隐藏)。图像撕裂出现在不同的地方。它总是在屏幕的顶部,但它可以是 20 像素,也可以是 50 像素。因此,在创建带有标题栏的窗口时,有时图像的顶部可能根本看不到图像撕裂。
java - 在没有 Opengl 或 Direct3d 管道的情况下使用 Java2d 进行平滑绘图?
当禁用 opengl 和 direct3d 管道时(通过使用 -Dsun.java2d.d3d=false 和 -Dsun.java2d.opengl=false 调用 vm),我无法找到使用 Java2d 获得平滑移动或动画的方法
下面快速而肮脏的代码演示了我的问题。它绘制了一个在屏幕上移动的框。方框位置每秒更新大约 60 次,屏幕重绘尽可能多的次数。它使用 BufferStrategy 类来实现双缓冲;翻转在“bs.show();”完成
代码(按退出键退出):
当我使用“java FluidMovement”正常执行此代码时,它像丝绸一样顺畅运行(除了偶尔的撕裂),因为 jvm 使用了 direct3d/directdraw 管道。当我使用“java -Dsun.java2d.d3d=false -Dsun.java2d.opengl=false FluidMovement”执行此代码时,它非常不稳定。
我不能假设使用了 direct3d 或 opengl 管道。管道不适用于我尝试过的 3 台机器中的 2 台;它只能在运行 Windows 7 的具有专用图形的机器上运行。无论如何我可以使盒子顺利移动,还是我应该求助于使用某种低级别访问权限的库,如 JOGL?
笔记:
- 帧率不是问题。在这两种情况下(启用和禁用管道),应用程序的运行速度都超过 300 fps。启用管道时,我强制关闭 vsync。
- 我试过 Toolkit.getDefaultToolkit().sync()
- 我尝试了许多不同类型的循环,但运动从来都不是真正流畅的。即使使用固定的帧速率,也会表现出相同的断断续续。
- 我试过以全屏独占模式运行框架。
- 我尝试过使用 3 个甚至 4 个缓冲区。
linux - glXSwapIntervalSGI 段错误
我试图在围绕 SDL 和 openGL 构建的程序中禁用 Linux 上的垂直同步。我正在运行一个以镓 0.4 作为驱动程序的旧集成 ATI 卡。
我尝试通过调用glXSwapInterval(0)
我的代码来禁用 vsync,但是当我这样做时,虽然程序编译得很好,但当我尝试运行它时会出现段错误。
gdb 给了我相当无益的信息:
有谁知道可能会发生什么?
opengl - OpenGL窗口系统屏幕撕裂预防
在我的 OpenGL 应用程序中,出于明显的原因,我想防止屏幕撕裂。到目前为止,我一直在使用 vsync。但我想用翻页缓冲区交换(更改指向监视器数据的指针而不是更改值)来替换它以提高性能。我的问题是:重要的窗口系统(Windows、Cocoa、X11)是否完全支持这种缓冲区交换,是否需要明确请求,还是默认行为?
bitmap - 使用 vsync 进行双缓冲(与屏幕刷新率同步) - C# windows 窗体
我一直在尝试以每秒 60 次的速度更新 PictureBox 的 BMP,其线条模式会随着每次更新而改变。发生的情况是图像在屏幕刷新之间进行了部分更新。所以,你看到的是一种模式的一部分,也是下一种模式的一部分。每次屏幕刷新时,我都需要精确更新一次。理想情况下,我的目标是更新后缓冲区,然后将其复制到前缓冲区。我听说您可以在游戏中使用 vsync 来锁定前端缓冲区,以便屏幕仅在屏幕刷新后立即更新。如果我可以利用这种锁定,它可以让我在每次刷新时精确更新一次。但我还没有弄清楚该怎么做。
有任何想法吗?
我确实尝试在 Windows 窗体中使用 DoubleBuffering = true 属性。但它可能不适用于 PictureBox。我使用 CopyMemory(本机 dll 调用)将新模式复制到 PictureBox 中的位图中。
在上一段中,我还尝试使用具有相同技术的 WriteableBitmap,但由于某种原因,后缓冲区从未复制到前缓冲区,即使我按照其他人在堆栈交换中建议的方式进行了操作。我试了几个小时左右。使用该技术,图像从未在屏幕上更新。
opengl - 使用垂直同步时,可接受的时序策略是什么?
来自对 OpenGL 编程的基本了解,所有必需的绘图操作都按顺序执行,每帧重绘一次。硬件的性能基本上决定了这种情况发生的速度。据我了解,游戏将尝试尽快绘制,因此重绘操作基本上包含在一个 while 循环中。然后将优化图形操作(图形引擎)以确保应用程序可以接受帧速率。
但是,支持垂直同步的图形硬件会将帧速率锁定到显示速率。第一个问题是图形引擎应该如何与硬件同步进行交互?这甚至可能还是渲染器以最大速度工作并且硬件有选择地调用最新帧,丢弃所有未使用的先前帧..?
这个问题的动机不是我立即打算编写一个图形引擎,而是正在调试现有系统的问题,其中移动场景的图形在屏幕上似乎结结巴巴。症状上,当 VSync 关闭时,口吃很轻微,当它打开时,要么有明显的周期性口吃,要么完全解决了口吃。对于正在发生的事情或原因,我有些抓不住,想了解更多有关图形系统的背景信息。
总而言之,问题在于人们应该如何与硬件重绘事件进行交互,以及这是否可能。但是,欢迎提供任何其他信息。