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

C++ 如何在Xlib应用程序中等待VSYNC?,c++,linux,x11,xlib,vsync,C++,Linux,X11,Xlib,Vsync,我正在使用XWindow Drawable、Pixmap和XRender在屏幕上绘制一些东西。我可以看到有时会有闪烁。有没有办法等待VBLANK?我已经在谷歌上搜索了很多,感觉就像在森林里寻找一枚硬币 没有涉及OpenGL。它是Linux(Ubuntu)。 我可以使用(nano)sleep(),但需要知道什么时候该画画了。我发现目前为止最简单的解决方案是使用GLX,因为它具有优秀的同步和双缓冲高级接口。请注意GLX不是OpenGL,它是一个X扩展。您需要一个虚拟OpenGL上下文,因为SwapB

我正在使用XWindow Drawable、Pixmap和XRender在屏幕上绘制一些东西。我可以看到有时会有闪烁。有没有办法等待VBLANK?我已经在谷歌上搜索了很多,感觉就像在森林里寻找一枚硬币

没有涉及OpenGL。它是Linux(Ubuntu)。
我可以使用(nano)sleep(),但需要知道什么时候该画画了。

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

如果出于任何原因希望在没有GLX的情况下执行此操作,可以通过X双缓冲区扩展(DBE)创建双缓冲区,并使用X同步扩展手动同步显示。我自己并没有这样做,但您应该能够找到您喜欢的调用XSyncListSystemCounters的方法(在正确初始化之后!):

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


但是,我无法找到更多关于艰难道路的自己。祝你好运。

你解决了这个问题吗?(很难找到X相关技术的文档…)因此我找到了一些XSyncListSystemCounters的文档。从那时起,我就能够拼凑出一个列表,列出系统计数器并显示它们的频率。不幸的是,至少在我的系统上,没有vsync计数器。只是一堆毫秒计时器(YMMV)