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

exe*_*ook 12 c++ linux x11 xlib vsync

我正在使用XWindow Drawable,Pixmap和XRender在屏幕上绘图.我可以看到有时闪烁.有没有办法等待VBLANK?我已经google了很多,感觉就像在森林里寻找一枚硬币.

没有OpenGL参与.它是Linux(Ubuntu).我可以使用(纳米)睡眠(),但需要知道什么时候绘制时间已经到了一些方法.

And*_*eas 6

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

如果出于任何原因要在没有GLX的情况下执行此操作,可以通过X Double Buffer Extension(DBE)创建双缓冲区并使用X Syncronization Extension手动同步以使其显示。我自己还没有这样做,但是您应该可以按自己的喜好调用XSyncListSystemCounters(在正确初始化之后!):

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

但是,我很难找到更多有关艰难道路的信息。祝好运。

  • 因此,我能够在[此处](https://www.x.org/releases/X11R7.7/doc/libXext/synclib.txt)找到 XSyncListSystemCounters 的一些文档。由此,我能够编写一个[测试程序](https://gist.github.com/JC3/fe3780cdfe609009e43ca14192a277eb),它列出了系统计数器并显示了它们的频率。不幸的是,至少在我的系统上,没有垂直同步计数器。只是一堆毫秒计时器。:( YMMV (3认同)