Как синхронизировать использование glutSwapBuffers в Wayland? - PullRequest
7 голосов
/ 05 апреля 2019

Я заметил, что моя анимация страдает от артефактов, которые выглядят как пропущенные vblanks. Нет видимых разрывов, но иногда рамка останавливается на долю секунды, а затем заметно прыгает. Я решил измерить время между заменами буфера:

void draw_cb() {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glutSwapBuffers();
  static auto last = std::chrono::high_resolution_clock::now();
  auto now = std::chrono::high_resolution_clock::now();
  std::cout
    << std::chrono::duration_cast<std::chrono::microseconds>(now - last).count()/1000.
    << '\n';
  last = now;
}

К моему удивлению, я вижу, как времена меняются на целых 1,5 миллисекунды, даже в этой совершенно нетребовательной рутине. Время, измеренное между кадрами, составляет около 16,6 мс, но довольно стабильно на верхней стороне:

enter image description here

Ничего не изменится, если я добавлю usleep из нескольких миллисекунд в обратный вызов отрисовки (если, конечно, не более 16 мс), подтверждая, что не команды рисования вызывают задержанный ответ, а ожидают vsync. Почему тогда я не вижу значения, очень близкие к 16.666 мс? Какие еще меры я могу предпринять, чтобы анимация была плавной? Я уверен, что мой компьютер достаточно быстрый.

Вот соответствующие части того, как я настраиваю freeglut:

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
    glutDisplayFunc(draw_cb);
    glutIdleFunc(glutPostRedisplay);

Я также попытался поместить обратный вызов в ничью в glutIdleFunc, без разницы.

Среда Linux + Gnome 3 на Wayland , встроенная графика. Средняя загрузка значительно ниже 1. Если присмотреться, glxgears демонстрирует аналогичное поведение, достигая примерно 291 кадра за 5 секунд в настройках по умолчанию.

Обновление

С большой помощью комментаторов я могу теперь сказать, что это из-за композитора. Работая на X без промежуточного слоя Wayland, я получаю гораздо более четкое распределение по центру:

Так что проблема специфична для Wayland (или, возможно, Gnome3 на Wayland). Вопрос остается неизменным: как получить плавную анимацию в этой настройке с минимальными изменениями? Я в порядке, чтобы отпустить freeglut, если это как-то не подходит, но я бы оценил что-то столь же простое и хотел бы оставить украшенное, управляемое окно, если это возможно. Я обновил заголовок.

...