如何在Xlib应用程序中等待VSYNC?

20

我正在使用 XWindow Drawable、Pixmap 和 XRender 在屏幕上绘制东西。有时会出现闪烁。有没有一种方法可以等待 VBLANK?我已经在 Google 上搜索了很多次,感觉像在森林中寻找硬币。

这里没有涉及到 OpenGL。它是 Linux (Ubuntu)。 我可以使用 (nano)sleep(),但需要知道何时绘制时间已经到来。


3
你修好了吗?(找到相关X技术的文档很难……) - étale-cohomology
1个回答

7

我发现最简单的解决方案是使用GLX,因为它具有出色的高级接口,可以实现同步和双缓冲。请注意,GLX不是OpenGL,它是一个X扩展。你需要一个虚拟的OpenGL上下文,因为SwapBuffers(由于某种奇怪的原因)要求这样做,但仅此而已。

如果由于任何原因你不想使用GLX,你可以通过创建X双缓冲扩展(DBE)来创建双缓冲,并使用X同步扩展手动向显示器同步。你可以尝试调用XSyncListSystemCounters来查找一些有用的东西,尽管这还没有经过测试:

XSyncListSystemCounters返回一个指向显示器支持的系统计数器数组的指针。


3
所以我找到了一些关于XSyncListSystemCounters的文档在这里。通过这个,我能够拼凑出一个test程序,列出系统计数器并显示它们的频率。不幸的是,在我的系统上,至少没有垂直同步计数器。只有一堆毫秒计时器。:( 你的情况可能会有所不同。 - Jason C
XSync 似乎是一个通用的同步解决方案。我看不出它如何用于等待图形硬件。 - ceving
@ceving 编辑后降低期望值。作为一个年龄更大、更有智慧的人,也许我应该再次进行这项调查。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接