К содержанию
fohbookбета/ TouchDesigner

Кук: когда узел считается

Узел считается, когда его данные кому-то нужны и у него что-то изменилось. Система тянет данные с конца — отсюда и половина загадок, и половина оптимизации.

Ветка вашего пульта:
Быстрый выбор:

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 — так процессор не ждёт видеокарту. Подробно — Из чего состоит кадр.

Нашли в статье ошибку, устаревшее или непонятное место?

рядом по смыслу