Вопрос на самом деле даже более общий - как добиться максимально возможного качества, воспроизводимого видео в Unity?
Стандартные инструменты (video player), как и сторонние ассеты (easy video texture) - с трудом, кое-как, тянут 4K видео.
При том, что железо совсем неплохое (карта nVidia 1060 6Gb, процессор i7).
Попытка увеличить разрешение - приводит к сильнейшим фризам (до нескольких секунд).
С чем связаны такие жесткие ограничения - непонятно. У меня даже на мобилке (samsung s7) - хоть и чуть медленнее нормы, но тянуло 4k (easy video texture в unity). А тут полноценная десктопная система, и такие тормоза...
При этом 4k для VR - это очень и очень мало. Во-первых, нужно стерео, а это уже увеличивает картинку в 2 раза (с 3840*2160, до 3840*3840), и комп ее уже не тянет. Во-вторых, 4k, будучи развернутыми на сферу - дают весьма размытую картинку... В идеале нужно играть 6400*6400, но это далеко за пределами возможностей...
Пробовал разные кодеки (unity поддерживает h264 и V8) - разницы почти нет. Пробовал сжимать самой unity (т.е. пережатие видеоклипа во внутренний формат) - опять же разница минимальна. Загрузка всего клипа в память - тоже на результат не влияет.
В связи с этим вопросы:
1. есть идеи, что можно сделать?
2. есть ли какие-то технологии "ямочного" рендера видео? Чтобы обсчитывать только ту часть видео, которую пользователь видит (конечно в приложении к unity)?
3. Можно складывать сферу видео из N-фрагментов и обсчитывать только видимые, но добиться идеальной синхронизации будет очень сложно. Возможно есть наработки в этой сфере?
3. Посоветуйте настройки/кодеки/форматы для видео? Может быть какие-то ассеты?
4. Ролики у меня короткие, до 1 минуты. Как вариант хранить видео в разжатом виде в памяти, но нужен какой-то промежуточный формат, так как простой дамп данных конечно будет слишком большим...
1)есть ли какие-то технологии "ямочного" рендера видео? Чтобы обсчитывать только ту часть видео, которую пользователь видит (конечно в приложении к unity)?
В указанных форматах о таком не слышал(скорее всего это невозможно или крайне проблематично, т.к. сжатие обеспечивается не только на основе предыдущих кадров, но и внутри одного(полного) кадра). Но вроде читал о существенной доработке MPEG-DASH(не помню что было внутри) как раз для VR разбивающей видео на сферу и транслирующей разные потоки в разном качестве в зависимости от центр, но речь шла о кастомном плеере насколько я помню, а не об юнити.
Звучит как очредная юнити-болячка(впрочем юнити сама болячка). Мб можно это дело спрофилировать и посмотреть на каком этапе затык(ОЗУ\видеопамять\производительность шейдеров\ЦП)?
Ну и имеет смысл задать этот вопрос на профильных ресурсах.
Пробовал делать Рrepare для видео - разницы не увидел. Пробовал файл видео разместить на RAM-диске в оперативной памяти, чтобы исключить задержки на чтение - тоже безрезультатно.
Когда то я читал, что аппаратное декодирование видео поддерживается только до 3840*2160. Похоже это и происходит. А при переключении на процессор - начинает очень сильно тормозить... Неужели ничего не сделать?
Даниил Бакалин,
>Когда то я читал, что аппаратное декодирование видео поддерживается только до 3840*2160. Похоже это и происходит. А при переключении на процессор - начинает очень сильно тормозить..Неужели ничего не сделать?
Профилироание подскажет, а пока это гадание на кофейной гуще.
Насколько мне известно у ВР очков сейчас максимум 2К на глаз, на оба глаза 4К. Т.е. в самом худшем положении когда FOV игрока полностью охватывает видео-экран вплотную(разрешение видео==разрешению рендера), должно хватать 4К(а то и меньше, тк FOV глаз пересекаются) - больше не имеет смысла.
Если экран далеко, то и того лучше - видео в 4К и не нужно, достаточно показывать в худшем разрешении(правда нужно синхронизировать).
key don, наверное, из вопроса это непонятно, но конечно имеется ввиду панорамное видео на 360 градусов. 3/4 кадра остается вне поля зрения.
На распространенных сейчас шлемах 4k, почти хватает, хотя конечно 5-6k - было бы лучше. Проблема в том, что даже для 4k - нужно стерео, а это соответственно уже 2*4k (кадр 3840*3840) - но его уже не тянет.
На счет профайлера - у меня с ним маловато опыта, но выглядит процесс так:
Если найдется время посмотреть подробнее - буду очень благодарен. Дамп профайлера
Интересно, что если посмотреть на число кадров в буфере, то оно растет вполне бодро - за 17 прошедших кадров - буфер заполняется на 16 кадров видео. Потом начинается воспроизведение, и буфер почти сразу пустеет... Если бы он продолжал заполняться с той же скоростью - видео бы подвисло гораздо позже, а может вообще играло бы без проблем. Но почему-то после начала воспроизведения буфер пополняется очень медленно.
При этом совсем непонятно где узкое место. Видеокарта задействована только на 17%, и бодро рендерит по 250 кадров/сек... В общем, чем дальше тем меньше понимаю.
p.s. Добавлю, что тормоза слишком сильные. После первых 20-30 кадров картинка зависает секунд на 10-15. Потом еще кадров 10 - опять зависает секунд на 15... и так далее. Все это при размере кадра 3840*3840. При том что 3840*2016 - играет без проблем.
Для тех кому интересен ответ на вопрос, а не советы сменить архитектуру или упражнения в остроумии - пишу к чему сам пришел на данный момент.
Из опробованных мной ассетов и библиотек, лучший результат показал AVPro Video.
Он умеет играть видео больше 4K используя аппаратные средства. На моей системе, 2*4K видео (стерео) - играет без проблем. Загрузка процессора ~40%, видеокарта ~30%.
Таким образом, производительность этого решения на unity, в протестированном кейсе, - не уступает "нативным" решениям (из тестированных, плеер Virtual desktop, GoPro Player, Steam 360 Player).
Если кто-то сможет добавить информацию по вопросу (а не о том, почему этот вопрос тупой) - буду очень благодарен. С выходов новых шлемов (например, Pimax) - качественные плеер станет большой проблемой. Так что решение вроде ямочного рендера - в любом случае необходимо, и рано или поздно появиться.
Любую дополнительную информацию, хотя бы косвенно относящуюся к исходному вопросу - с удовольствием отмечу решением. Пока, решения на вопрос НЕТ.
Потребности VR сейчас растут гораздо быстрее чем возможности графических процессоров. И на задаче панорамного видео - это как раз хорошо видно.
В этом году выйдет шлем с 4K на каждый глаз (Pimax 8K). Это порядка 12-15K на панорамное видео.
Через год, максимум 2 - выйдет 8K на каждый глаз. Это до 30K видео... Один кадр 30K стерео-видео - это 30000*15000 пикселей, или около 3,6Gb в видеопамяти. Секунда в буфере потребуют 108 Gb... Ни одна видеокарта в ближайшие пару лет такое точно не потянет.
А главное - это совершенно избыточно. Разрешение человеческого глаза порядка 100Мпикс, но только в центральных 5 градусах. Дальше воспринимаемое разрешение падает очень быстро, достигая долей пикселей на градус в периферийной зоне. Фактически, производительности современных видеокарт почти достаточно чтобы рендерить "идеальную" картинку для VR, но только при наличии ямочного рендера, и в ближайшие годы это не изменится, потребность также будет опережать возможности.
Конечно, никакого 30K-видео в ближайшие годы не будет. Скорее всего все надолго застрянет на 8-12K, а детали будут просто "дорисовываться" нейросетью, чтобы создать видимость высокой четкости.
но только при наличии ямочного рендера, и в ближайшие годы это не изменится, потребность также будет опережать возможности
Есть какие то производители, которые двигаются в этом направлении, хотя бы установка датчиков направления взгляда (как минимум это еще один вектор управления)?
rPman, Да, конечно. Из самых ближайших, добавить отслеживание глаз обещают в Pimax который должен выйти летом. Так или иначе все производители работают над этим вопросом, в частности потому, что это позволит добавить в картинку глубину резкости. Мозг привык четко видеть только тот объект, на который смотрит, а в VR - четко выглядит вся картинка. Это вызывает ощущение недостоверности. Но имея eye-tracker в шлеме - можно вычислить на какую глубину "сфокусирован" глаз (реальной перефокусировки не будет, это только обман мозга), и размыть все за пределами этого расстояния. Потенциально это увеличит погруженность, но законченных решений пока вроде нет.
Следующий этап - это уже очки светового поля, наподобие тех что обещает magic leap. Они тоже должны выйти летом (и в них кстати вроде тоже есть трекинг глаз), но что именно - пока неясно.
Вы пытаетесь охладить пиво кондиционером и жалуетесь на скорость процесса. (А ведь кондиционер не дешевый, пусть даже топовый). Не надо думать как ускорить процесс, надо просто холодильник для этой задачи использовать.
Список сомнительных затей:
Открывать пиво зубами
Блокировать телеграм по ip
Заниматься сексом с партнером того же пола
Зарабатывать на биткоинах
Программировать на html
Рендерить видео средствами игрового движка
наверное, из вопроса это непонятно, но конечно имеется ввиду панорамное видео на 360 градусов. 3/4 кадра остается вне поля зрения.
Понимаете, вы пытаетесь использовать движок для работы с 3д графикой, чтобы рендерить видео хрен пойми как. Это достаточно редкий кейс в играх, и никто не оптимизировал под ваши задачи, а уж темболее под куллинг и прочее.
Тем боле ераньше юнити вообще не умело то и видео играть, версии так в 4 без плагинов точно.
Совет - не используйте юнити. Напишите свой рендер на DirectX/OpenGL, где и реализуйте оптимальный для вашей СПЕЦИФИЧНОЙ задачи алгоритм. А использовать комбайн на узких и специфичных кейсах - плохой вариант.
Unity - все же движок для игр, а это не только полигоны, но и много чего еще. Панорамное видео в VR - совершенно обычная и востребованная функция. Я только обратил внимание на то, что в этом вопросе производительность хорошей десктопной машины почти не превосходит мобильник трехлетней давности. На мой взгляд это странно, и я попросил совета у сообщества, в надежде что кто-то сталкивался с такой проблемой или хотя бы подскажет куда можно посмотреть.
Совет сменить архитектуру конечно замечательный, но вопрос не об этом. Unity была выбрана обоснованно и небольшие проблемы с качеством видео явно не стоят переработки всего. Отсутствие в unity оптимизации для проигрывания видео - тоже не для кого не секрет, но это не повод сдаваться. Нужно просто найти варианты решения, и какие-то я уже нашел, буду искать дальше.