Кук: когда узел считается
Узел считается, когда его данные кому-то нужны и у него что-то изменилось. Система тянет данные с конца — отсюда и половина загадок, и половина оптимизации.
Cook — пересчёт оператора. TouchDesigner не пересчитывает всю сеть каждый кадр, только то, что нужно. Если это понимать, проще собирать проекты, которые не тормозят.
Тянет, а не толкает
Кажется, что изменение течёт вниз: поменяли Constant CHOP — за ним пересчитался Math. На деле Constant только помечается «грязным» и ждёт, пока у него попросят данные.
Просят те, кому результат нужен сейчас: видимый в сети вьюер, панель или
Window COMP на экране, операторы отправки наружу вроде Touch Out и OSC Out,
вывод видео и звука — NDI Out TOP, Video Device Out TOP, Audio Device Out
CHOP, — узел, в параметр которого что-то экспортируется, и вызов
op('…').cook(). Каждый кадр вывод тянет нужные ему узлы, те — свои входы
и всё, на что ссылаются их параметры. Узел, который никому не нужен,
не считается вообще, как бы ни менялись его параметры.
Запрос и причина
Кук случается, когда сходятся два условия. Первое — запрос: кто-то ниже хочет данные. Второе — причина: с прошлого кука кукнулся вход или узел, на который ссылается параметр; изменился параметр или результат выражения; узел зависит от времени и каждый кадр отдаёт новое (Time Slice CHOP, Video Device In TOP, LFO); с панелью взаимодействует человек; на узле выполнили скриптовую команду.
Запрос без причины ничего не стоит. Constant CHOP без выражений с открытым вьюером получает запросы на каждой перерисовке интерфейса, но не кукается ни разу.
Кто считается всегда
Операторы вывода — Movie File Out TOP, Touch Out и прочие *Out — кукаются
каждый кадр без всяких причин: получатель ждёт непрерывный поток. Render
TOP и входящие операторы вроде Touch In и Pipe In кукаются на любой
запрос, потому что проверять изменения в сцене им дороже, чем посчитать.
У части операторов есть свой переключатель Cook Every Frame или
Always Cook — у OSC Out CHOP, MIDI Out CHOP, Audio Device Out CHOP,
Cache TOP, Hog CHOP и ещё нескольких.
Узел, который кукается каждый кадр, каждый кадр запрашивает входы. Обычные входы пересчитаются только при изменениях, а Render TOP выше по цепочке — всегда. Из-за одного такого переключателя в глубине компонента может постоянно считаться рендер сцены, которую никто не видит; если непонятно, откуда нагрузка, сначала ищите его.
| Симптом | Причина |
|---|---|
| Меняю параметр, ничего не происходит | Узел никто не тянет: он не подключён к выводу и его вьюер выключен |
| Ветка «зависла» на старом кадре | Заморожена замком или выключен Cooking у компонента |
| Патч тормозит, хотя на экране почти ничего нет | Кто-то тянет лишнее: открытые вьюеры, операторы вывода, Cook Every Frame, Render TOP, который пересчитывается на каждый запрос |
| Стоит закрыть панель с вьюерами — становится быстрее | Вьюеры узлов просят данные, которые на выводе не нужны |
Как увидеть
Средний клик по узлу показывает, сколько раз он кукался и сколько длился
последний кук. Бегущий пунктир на проводе значит, что кукается узел выше,
а нижний при этом может и стоять. Performance Monitor (Alt+Y, он же
Dialogs → Performance Monitor) раскладывает один кадр по узлам, probe
из палитры (папка Tools) рисует время и память вживую, а Info CHOP на узле
даёт каналы total_cooks, cook_time, cooked_this_frame, у TOP ещё
gpu_memory_used. Подробно — Монитор и Probe.
Как считать меньше
Switch TOP пропускает дальше один вход, и тянуть остальные ему незачем,
пока не включён Blend between Inputs, — поэтому выбор варианта делают
им, а не Blend. Длинные провода через полсети заменяют Null и Select,
статичные тяжёлые узлы запирают замком. Блок, который сейчас не нужен,
выключают флагом Cooking или op('scene2').allowCooking = False, лишние
вьюеры закрывают, панели с вьюерами на шоу не держат. А маске для
пост-эффекта не нужен 4K — Разрешение.
Порядок кука внутри кадра задаёт цепочка зависимостей, а не семейство
узла: считается то, что нужно следующему, и так до вывода. Значение CHOP
попадает в картинку в том же кадре, если картинка его запросила. Задержку
в кадр даёт, например, TOP to CHOP с Download Type: Next frame — так
процессор не ждёт видеокарту. Подробно — Из чего состоит кадр.
Нашли в статье ошибку, устаревшее или непонятное место?