Я программирую видео программное обеспечение, где я использую Qt QGLWidget, чтобы показать кадры со следующим кодом:
glTexImage2D(GL_TEXTURE_2D, 0, (color ? GL_RGB8 : GL_LUMINANCE8), VIDEO_WIDTH, VIDEO_HEIGHT, 0, (color ? GL_RGB : GL_LUMINANCE), GL_UNSIGNED_BYTE, (GLubyte*)imBuf);
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0); glVertex2d(-1.0,+1.0);
glTexCoord2d(1.0,0.0); glVertex2d(+1.0,+1.0);
glTexCoord2d(1.0,1.0); glVertex2d(+1.0,-1.0);
glTexCoord2d(0.0,1.0); glVertex2d(-1.0,-1.0);
glEnd();
updateGL();
Я хочу использовать vsync, поэтому я установил swapInterval равным 1. Я измерил время для выполнения кода выше. Как и ожидалось, для обновления updateGL требуется около 16 мс. Что меня удивляет, так это то, что glTexImage2D также требует 1..16 мс времени для выполнения, как если бы он также ожидал сигнала VBLANK. Когда я выключаю vsync с swapInterval, равным 0, glTexImage2D занимает всего около 1 мс для выполнения. Теперь вместо задержки в 16 мс для всей программы, которую должен дать vsync, я получаю 32 мс в худшем случае. Я не понимаю, почему updateGL и glTexImage2D оба ждут VBLANK. Я хочу сделать как можно меньше задержек, чтобы кто-нибудь объяснил, что здесь происходит?
glTexImage2D
это очень дорогой вызов, так как он заново инициализирует весь объект текстуры с нуля. Для просто обновления изображений видео текстуры используйте glTexSubImage2D
что намного быстрее. Вы можете комбинировать это с Пиксельный буферный объект разрешить OpenGL еще более асинхронную операцию.
Других решений пока нет …