xlib / egl как получить VSync/swapInterval на eglSwapBuffers
Мне интересно, как правильно включить vsync с eglSwapBuffers
при использовании xlib. Кажется, что звонки eglSwapInterval
просто игнорируются.
Я бегу как в оконном, так и в полноэкранном режиме. Возможно ли, что он просто не поддерживается в оконном режиме? В этом случае, что является хорошим способом уменьшить частоту, с которой я рендеринг (сон имеет тенденцию вызывать ошибочное поведение, так как нет никакой гарантии, когда он просыпается).
1 ответ
В конце концов я нашел это после большого количества поиска в Google:
http://lists.freedesktop.org/archives/mesa-commit/2010-May/021020.html
egl: внедрить EGL_NOK_swap_region
Это расширение добавляет новую функцию, которая предоставляет альтернативу eglSwapBuffers. eglSwapBuffersRegionNOK принимает два новых параметра в дополнение к параметрам в eglSwapBuffers. Новые параметры состоят из указателя на список 4-х целочисленных блоков, определяющих прямоугольники (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 кадров в секунду; так что мне все еще нужно уснуть между кадрами. Может быть, он блокирует только замену буферов в течение короткого интервала критических операций графического процессора? Или, может быть, я не делаю это правильно. Точно сказать не могу.