xlib / egl如何在eglSwapBuffers上获取VSync / swapInterval

时间:2012-08-15 15:09:16

标签: linux xlib egl

我想知道如何在使用xlib时正确启用与eglSwapBuffers的vsync。似乎忽略了对eglSwapInterval的调用。

我在窗口和全屏模式下运行。是否可能在窗口模式下不支持它?在这种情况下,什么是降低渲染频率的好方法(睡眠往往会导致错误的行为,因为它无法保证醒来时)。

1 个答案:

答案 0 :(得分:1)

最终我在谷歌搜索后发现了这个:

http://lists.freedesktop.org/archives/mesa-commit/2010-May/021020.html

  

egl:实施EGL_NOK_swap_region

     

此扩展程序添加了一个新功能,可提供替代功能   eglSwapBuffers。 eglSwapBuffersRegionNOK接受两个新参数   除了eglSwapBuffers中的那些。新参数包括a   指向定义矩形的4个整数块列表的指针(x,y,   width,height)和一个指定矩形数的整数   清单。

/usr/include/EGL/eglmesaext.h声明

EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint* rects);

这里还有一些示例用法:

https://github.com/blazt/piglit/blob/master/tests/egl/egl-nok-swap-region.c

所以我尝试使用它:

EGLint dirtyRect[4] = { 0, 0, 0, 0 };
PFNEGLSWAPBUFFERSREGIONNOK swap_buffers_region = (PFNEGLSWAPBUFFERSREGIONNOK)
    eglGetProcAddress("eglSwapBuffersRegionNOK");

并在我的窗口中调整回调

dirtyRect[2] = windowWidth;
dirtyRect[3] = windowHeight;

并在我的主循环中

if (swap_buffers_region)
    swap_buffers_region(egl_dpy, egl_surf, 1, dirtyRect);
else
    eglSwapBuffers(egl_dpy, egl_surf);

它确实看起来更平滑,并且降低了帧速率,但只能达到180-200 FPS的范围;所以我仍然需要在帧之间做一个睡眠。也许它只会在关键GPU操作的短暂间隔期间阻止交换缓冲区?或者也许我做得不对。不确定。