【发布时间】:2016-04-27 11:21:06
【问题描述】:
我想知道是否可以通过任何文件描述符捕获屏幕垂直同步事件并 [select |民意调查 | epoll]正在处理它。
通常,如果我是对的,glXSwapBuffers() 不会阻止该过程,因此我可以执行以下操作:
int init() {
create epollfd;
add Xconnection number to it;
add some other fd like socket timer tty etc...
possibly add a vsync fd like dri/card0 or fb0 or other???
return epollfd;
}
main() {
int run = 1;
int epollfd = init();
while(run) {
epoll_wait(epollfd, ...) {
if(trigedfd = socket) {
do network computing;
}
if(trigedfd = timer) {
do physics computing;
}
if(trigedfd = tty) {
do electronic communications;
}
if(trigedfd = Xconnection number) {
switch(Xevent) {
case key event:
do key computing;
case mouse event:
do mouse computing;
case vsync???:
do GL computings;
glXSwapBuffers();
}
}
if(trigedfd = dri/card0 or fb0 or other???) {
do GL computings;
glXSwapBuffers();
}
}
}
这样我就可以触发任何事件,无论何时发生 vsync 事件,并避免在我仅使用 X 绘图功能和可能 GL 进行 vsync 的情况下同时出现撕裂效应。
libdrm 可以帮助我吗?更普遍的问题是:
那么我必须使用什么 fd 来捕获 vsync 事件以及如何使这个 fd 上发生的事件是 vsync 事件?
【问题讨论】:
-
请注意,我想让它成为单线程的。我可以创建一个单独的进程,它就像一个服务器,我可以连接到它并发送一个请求“当 vsync 发生时唤醒我”,这个进程可以阻止 glFinish,然后通过套接字或管道或其他方式发送一些东西,我会避免它也是。
-
你到底为什么想要这个?这可能是the XY problem 的情况吗?
-
我正在创建自己的库/api,我希望进程的所有传入事件只有一个同步点。
标签: c x11 framebuffer epoll glx