Память видеокарты
Каждый TOP — текстура в видеопамяти. Как посчитать, что её съедает, как освободить без выключения, как поймать утечку и что бывает, когда память кончилась.
Каждый 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 progressiveUnload()
у компонента растягивает выгрузку детей на несколько кадров — по кадрам,
времени, узлам или мегабайтам за кадр, — чтобы обошлось без рывка,
а progressiveUnloader показывает ход.
Выгруженный узел снова займёт память, как только у него запросят данные. Выгруженную сцену не должен тянуть ни вьюер, ни Switch, ни ссылка из параметра.
Утечки и переполнение
| Причина | Как видно |
|---|---|
| Скрипт создаёт операторы и не удаляет | Растёт totalops |
| В Table DAT копятся строки | Растёт cpumemused |
| Кэш не очищается | Растёт gpumemused |
| Внешняя библиотека Python | Растёт память процесса |
Ловят длинным прогоном: каналы памяти Perform CHOP в файл или Trail CHOP
и probe в режиме памяти — Performance Monitor и probe.
Инсталляцию до сдачи гоняют сутки без рук — Инсталляция без оператора.
Когда память переполнена, начинается подкачка: частота падает в разы, рывки,
иногда чёрный экран или падение. Видно сразу: gpumemused упёрся в
totalgpumem.
Пятую часть видеопамяти держат свободной: её же расходуют драйвер, рабочий стол, декодер видео, NDI и соседние программы, и в пике запаса может не хватить.
Нашли в статье ошибку, устаревшее или непонятное место?