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