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

Память видеокарты

Каждый TOP — текстура в видеопамяти. Как посчитать, что её съедает, как освободить без выключения, как поймать утечку и что бывает, когда память кончилась.

Ветка вашего пульта:1 фрагмент статьи для версий новее вашей1 фрагмент статьи для версий новее вашей
Быстрый выбор:

Каждый TOP хранит результат текстурой в видеопамяти. Пока память есть, этого не видно. Кончилась — драйвер выгружает данные в системную память, и частота падает обвалом.

байт = ширина × высота × каналы × байт_на_канал
Кадр 8 бит RGBA 16 бит float RGBA 32 бита float RGBA
1280 × 720 3,5 МБ 7 МБ 14 МБ
1920 × 1080 8 МБ 16 МБ 32 МБ
3840 × 2160 32 МБ 63 МБ 127 МБ

Тридцать узлов в 4K и 32 битах — почти 4 ГБ на одни промежуточные. В уме не считают: gpu_memory_used у Info CHOP на TOP, разрешение и формат — в справке по среднему клику. Бывает, узел вчетверо больше ожидаемого, потому что унаследовал разрешение не оттуда. По процессу — gpumemused и totalgpumem у Perform CHOP.

Видеопамять расходуют длинные цепочки TOP в полном разрешении, 32 бита там, где хватает 16 или 8 (Разрешение и формат), Cache TOP пропорционально числу кадров, текстуры сцены и одно и то же, посчитанное в нескольких ветках. Кадры, которые Movie File In читает заранее (Pre-Read Frames), лежат в оперативной памяти. Audio Play CHOP грузит туда весь файл, и длинный звук играют через Audio File In CHOP.

Экономия

Маски, размытие, свечение, feedback почти никогда не просят полного размера. Маске хватает 8-bit fixed (Mono) — вчетверо меньше RGBA. Нужное в нескольких местах считают раз и раздают из Null TOP. 16 и 32 бита держат в середине цепочки, на выходе — 8. Неактивную сцену выключают флагом Cooking или allowCooking = False: она перестаёт считаться, и память её TOP освобождается.

Без выключения память отдаёт op('…').unload(). У Movie File In с cacheMemory=True память ролика остаётся в кэше под следующий ролик того же кодека и разрешения.

Появилось в 2025.30000 · в вашей версии этого нет

С ветки 2025.30000 progressiveUnload() у компонента растягивает выгрузку детей на несколько кадров — по кадрам, времени, узлам или мегабайтам за кадр, — чтобы обошлось без рывка, а progressiveUnloader показывает ход.

Память вернётся при следующем куке

Выгруженный узел снова займёт память, как только у него запросят данные. Выгруженную сцену не должен тянуть ни вьюер, ни Switch, ни ссылка из параметра.

Утечки и переполнение

Причина Как видно
Скрипт создаёт операторы и не удаляет Растёт totalops
В Table DAT копятся строки Растёт cpumemused
Кэш не очищается Растёт gpumemused
Внешняя библиотека Python Растёт память процесса

Ловят длинным прогоном: каналы памяти Perform CHOP в файл или Trail CHOP и probe в режиме памяти — Performance Monitor и probe. Инсталляцию до сдачи гоняют сутки без рук — Инсталляция без оператора.

Когда память переполнена, начинается подкачка: частота падает в разы, рывки, иногда чёрный экран или падение. Видно сразу: gpumemused упёрся в totalgpumem.

Запас

Пятую часть видеопамяти держат свободной: её же расходуют драйвер, рабочий стол, декодер видео, NDI и соседние программы, и в пике запаса может не хватить.

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

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