首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >xlib / egl如何在eglSwapBuffers上获取VSync/swapInterval

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

Stack Overflow用户
提问于 2012-08-15 15:09:16
回答 1查看 2.1K关注 0票数 1

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

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

EN

回答 1

Stack Overflow用户

发布于 2013-04-08 21:13:26

最后,我在谷歌上搜索了很多之后发现了这个:

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

egl:实现EGL_NOK_swap_region 这个扩展增加了一个新函数,它为eglSwapBuffers提供了一个替代方案。eglSwapBuffersRegionNOK除了接受eglSwapBuffers中的参数外,还接受两个新的参数。新参数包括指向定义矩形(x、y、宽度、高度)的4整数块列表的指针和指定列表中矩形数的整数。

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

代码语言:javascript
运行
复制
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

所以我试着这样用它:

代码语言:javascript
运行
复制
EGLint dirtyRect[4] = { 0, 0, 0, 0 };
PFNEGLSWAPBUFFERSREGIONNOK swap_buffers_region = (PFNEGLSWAPBUFFERSREGIONNOK)
    eglGetProcAddress("eglSwapBuffersRegionNOK");

在我的窗口中调整回调的大小

代码语言:javascript
运行
复制
dirtyRect[2] = windowWidth;
dirtyRect[3] = windowHeight;

在我的主回路里

代码语言:javascript
运行
复制
if (swap_buffers_region)
    swap_buffers_region(egl_dpy, egl_surf, 1, dirtyRect);
else
    eglSwapBuffers(egl_dpy, egl_surf);

它看起来确实更平滑,并且减慢了帧速率,但只降到了180到200 FPS的范围;所以我仍然需要在帧间进行睡眠。也许它只是在关键GPU操作的短时间间隔内阻塞交换缓冲区?或者我做得不对。不确定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11971947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档