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



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

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

最终,经过大量谷歌搜索,我发现了这个:

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

egl:实现EGL_NOK_swap_region

此扩展添加了一个新功能,该函数提供了替代 eglSwapBuffers.eglSwapBuffersRegionNOK 接受两个新参数 除了 eglSwapBuffers 中的那些。新参数包括 指向定义矩形 (x, y, 宽度、高度)和一个整数,用于指定矩形的数量 列表。

和/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 操作的某个短时间间隔内阻止交换缓冲区? 或者也许我做得不对。 不确定。

最新更新