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 кадров в секунду; так что мне все еще нужно уснуть между кадрами. Может быть, он блокирует только замену буферов в течение короткого интервала критических операций графического процессора? Или, может быть, я не делаю это правильно. Точно сказать не могу.

Другие вопросы по тегам