簡體   English   中英

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

[英]xlib / egl how to get VSync/swapInterval on eglSwapBuffers

我想知道使用eglSwapBuffers時如何使用eglSwapBuffers正確啟用vsync。 似乎對eglSwapInterval調用只是被忽略了。

我同時在窗口模式和全屏模式下運行。 窗口模式是否可能根本不支持它? 在這種情況下,什么是減少我渲染頻率的好方法(睡眠往往會導致不穩定的行為,因為無法保證它會醒來)。

經過大量的谷歌搜索,最終我發現了這一點:

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

egl:實施EGL_NOK_swap_region

此擴展添加了一個新功能,該功能可替代eglSwapBuffers。 除了eglSwapBuffers中的參數外,eglSwapBuffersRegionNOK還接受兩個新參數。 新參數包括一個指向定義矩形(x,y,寬度,高度)的4整數塊列表的指針,以及一個指定列表中矩形數量的整數。

和/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操作的短暫間隔內阻止交換緩沖區? 也許我做的不對。 不確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM