我想知道如何在使用 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 操作的某个短时间间隔内阻止交换缓冲区? 或者也许我做得不对。 不确定。