Я использую OpenGL, Ffmpeg и SDL для воспроизведения видео и в настоящее время оптимизирую процесс получения кадров, декодирования их, преобразования их из YUV в RGB, загрузки их в текстуру и отображения текстуры на четырехугольнике.Каждый из этих этапов выполняется отдельным потоком, и они записываются в общие буферы, которые управляются мьютексами и условиями SDL (за исключением загрузки и отображения текстур, поскольку они должны находиться в одном контексте).
У меня есть плеер, работающий нормально с контекстом декодирования, конвертирования и OpenGL в отдельных потоках, но я понял, что, поскольку скорость видео составляет 25 кадров в секунду, я получаю только преобразованный кадр из буфера, загружаю его в OpenGL и связываю / отображаюкаждые 40 миллисекунд в потоке OpenGL.Цикл рендеринга вращается примерно 6-10 раз, не показывая следующий кадр для каждого кадра, который он показывает, из-за этого промежутка в 40 мс.
Поэтому я решил, что было бы неплохо иметь буфер для текстур тожеи настроить массив текстур, созданных и инициализированных с помощью glGenTextures () и необходимых мне glParameters и т. д.
Когда прошло не более 40 мс с момента последнего обновления кадра, запускается метод, который захватывает следующий преобразованный кадриз буфера преобразования и загружает его в следующую свободную текстуру в буфере текстуры, связывая его, затем вызывая glTexSubImage2D ().Когда с момента последнего обновления кадра прошло 40 мс, запускается отдельный метод, который извлекает следующую текстуру GLuint из буфера текстур и связывает ее с помощью glBindTexture ().Таким образом, я просто делю то, что делалось ранее (захват из буфера преобразования, выгрузка, отображение) на отдельные методы (захват из буфера преобразования, выгрузка в буфер текстуры | и | захват из буфера текстуры, отображение), чтобы использоватьпотерянное время между обновлениями 40 мс.
Это звучит разумно?Поскольку при запуске видео останавливается все время от случая к случаю, иногда воспроизводится около 4 кадров, когда они должны (каждые 40 мс), но затем возникает 2-секундный интервал, затем отображается 1 кадр, затем 3-секундный интервали видео полностью недоступно для просмотра.
Код почти идентичен тому, как я управляю потоком преобразования, получая декодированные кадры из буфера декодирования, преобразовывая их из YUV в RGB и затем помещая их в буфер преобразования, чтобыне вижу, где может быть массивное узкое место.
Может ли узкое место быть на стороне OpenGL?Проблема заключается в том, что я сохраняю новые данные изображения для 10 различных текстур. Проблема заключается в том, что когда новая текстура извлекается из буфера текстур, необработанные данные могут находиться на расстоянии миллиона миль от последней с точки зрения расположения памяти в видеопамяти.?Это моя единственная попытка ответа, но я не очень разбираюсь в том, как OpenGL работает внутри, поэтому я публикую здесь.
У кого-нибудь есть идеи?