Xlib / egl comment obtenir VSync/swapInterval sur eglSwapBuffers
je me demande comment activer correctement vsync avec eglSwapBuffers
en utilisant xlib. Il semble que les appels à eglSwapInterval
soient tout simplement ignorés.
j'exécute à la fois en mode fenêtré et plein écran. Est-il possible qu'il ne soit tout simplement pas supporté en mode fenêtré? Dans ce cas, quelle est la bonne façon de réduire la fréquence à laquelle je rends (le sommeil tend à causer un comportement errant car il n'y a aucune garantie quand il se réveille).
1 réponses
finalement j'ai trouvé ceci après beaucoup de googling:
http://lists.freedesktop.org/archives/mesa-commit/2010-May/021020.html
egl: Implement EGL_NOK_swap_region
cette extension ajoute une nouvelle fonction qui offre une alternative à eglSwapBuffers. eglSwapBuffersRegionNOK accepte deux nouveaux paramètres dans en plus de ceux de eglSwapBuffers. Les nouveaux paramètres composé d'un pointer vers une liste de blocs de 4 entiers définissant des rectangles (x, y, largeur, hauteur) et un entier spécifiant le nombre de rectangles liste.
et/usr/include/EGL / eglmesaext.h déclare
EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint* rects);
il y a aussi un exemple d'usage ici:
https://github.com/blazt/piglit/blob/master/tests/egl/egl-nok-swap-region.c
alors j'ai essayé en l'utilisant comme ceci:
EGLint dirtyRect[4] = { 0, 0, 0, 0 };
PFNEGLSWAPBUFFERSREGIONNOK swap_buffers_region = (PFNEGLSWAPBUFFERSREGIONNOK)
eglGetProcAddress("eglSwapBuffersRegionNOK");
et dans mon redimensionnement de la fenêtre de rappel
dirtyRect[2] = windowWidth;
dirtyRect[3] = windowHeight;
et dans ma boucle principale
if (swap_buffers_region)
swap_buffers_region(egl_dpy, egl_surf, 1, dirtyRect);
else
eglSwapBuffers(egl_dpy, egl_surf);
il semble plus lisse et a ralenti le taux de cadre, mais seulement vers le bas de la gamme de 180-200 FPS; donc j'ai encore besoin de faire un sommeil entre les cadres. Peut-être qu'il bloque seulement l'échange de tampons pendant un court intervalle des opérations critiques de GPU? Ou peut-être que je ne suis pas en train de faire. Pas sûr.