Кэш и предзагрузка
Cache TOP держит прошлые кадры, Pre-Read и preload() готовят файл заранее, прогрев прячет от зрителя первые дорогие секунды.
Всё, что читается с диска или долго считается, должно быть готово до того, как понадобится. Иначе шоу дёргается ровно на переходе.
Cache TOP
Cache TOP складывает в видеопамять последние кадры входа, сколько задано
в Cache Size, а Cache Select TOP достаёт их по индексу: 0 — текущий,
−1 — предыдущий и так далее.
| Задача | Как |
|---|---|
| Задержка картинки на N кадров | Cache + Cache Select с индексом −N |
| Эффект «шлейфа» | Несколько Cache Select с разными индексами, сложить |
| Стоп-кадр | Выключить Active у Cache — он перестанет принимать новые кадры |
| Замедление и проигрывание буфера | Output Index у самого Cache с дробным значением и Interpolate Frames |
| Снимок пустой сцены | Get One Image on Startup или разовая запись по Replace Pulse |
Память считается в лоб: кадры × ширина × высота × каналы × байты. Сто кадров FullHD в 8-битном RGBA — около 830 МБ, и в видеопамять упереться легко.
Видеофайлы
Pre-Read Frames на странице Tune у Movie File In держит наготове
распакованные кадры. Увеличивайте его, пока не пропадёт рывок в начале
клипа и после перемотки, и не дальше: каждый кадр — память процессора.
Файл, который понадобится позже, открывает op('clipB').preload() —
читает первые кадры, стараясь не мешать текущему воспроизведению,
а op('clipB').isFullyPreRead сообщает, что всё готово. При запуске
проекта Derivative советует вместо этого просто вызвать cook()
у плеера.
Плейлист держится на том же: следующий клип уже открыт во втором Movie
File In с выключенным Play, вывод идёт через Cross или Switch, и смена
клипа — это движение параметра, а не открытие файла.
clipA ─┐
├─ cross ──▶ out
clipB ─┘
Пока играет A, скрипт ставит B на нужный кадр. Подробнее — Movie File In и Плейлист.
Прогрев
Первые кадры после запуска самые дорогие: компилируются шейдеры, читаются
файлы, выделяется память. Поэтому инсталляция стартует с чёрным выводом,
прогоняет все сцены и переходы невидимо, ждёт ровной частоты по каналам
fps и droppedframes у Perform CHOP и только потом открывает картинку.
Нейросети греют так же: первый проход модели всегда
медленнее.
Perform CHOP отдаёт занятую видеопамять (gpumemused) и память процессора
(cpumemused), Info CHOP на TOP — gpu_memory_used узла. Утечка видна
как плавный рост памяти за часы, а падает инсталляция потом ночью.
Новое разрешение на входе заставляет узлы цепочки заново выделять видеопамять, и на шоу это может стоить рывка. Держите размер постоянным — Разрешение.
Нашли в статье ошибку, устаревшее или непонятное место?