Моя проблема:
У меня есть видео (скажем, 25 кадров в секунду), которое нужно отображать с помощью opengles 2.0 на экране. Для чтения видео я использую декодер, который декодирует это видео в текстуры OpenGL. С помощью renderpass я рисую эту текстуру на экране.
Что мне нужно сделать, так это получить изображение из декодера, загрузить его в графический процессор, вызвать шейдерную программу и отобразить изображение на экране. Если видео имеет 25 кадров в секунду, мне нужно обновить экран с шагом 40 мс (1000 мс / 25 кадров в секунду).
На каждом этапе я должен сделать следующее:
- получить изображение из декодера
- запихнуть его в память gpu
- визуализировать экран
- поменять местами буферы
Пока это работает. Теперь случается, что декодеру требуется больше 40 мс для декодирования кадра. Это происходит не постоянно, а иногда.
Решением будет создание кеша. Это означает, что я делаю рендеринг, т.е. 5 изображений, прежде чем показывать первое. Это связано с проблемой, это должно происходить асинхронно, чтобы кеш мог создаваться и экран отображался одновременно. Если это произойдет, вы можете увидеть это на видео, потому что оно больше не «текучее».
Мой вопрос:
- Есть ли решение для этого?
- Можно ли создать ?-буфер, который можно скопировать (?!) в задний буфер поверхности рендеринга, чтобы я мог создать кеш с такими буферами и скопировать его в задний буфер, не блокируя другой поток, который создает эти буферы?
OR
- Как заполнить задний буфер другим буфером?
Я уже пробовал:
- Рендеринг кадрового буфера (текстур) в виде кеша. Это работает почти идеально, за исключением того, что текстура также должна быть визуализирована. Это означает, что (поскольку это асинхронно), если создается кэш-кадр и создается изображение для экрана, вы должны мьютексировать (/синхронизировать) методы рендеринга, иначе программа выйдет из строя. Но синхронизация сводится к тому, чтобы сделать ее асинхронной. Так что это не очень хорошее решение.