← все статьи

Резервирование пульта: что на самом деле нужно перенести на второй компьютер

Почему реплицировать состояние светового движка — плохая идея, чем зеркало кадра лучше, зачем нужна отдельно позиция в кью-листе и почему возврат управления делается руками.

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

Дальше начинается инженерия, и первое же решение определяет, получится у вас рабочая схема или красивая, которая подведёт в самый неподходящий момент.

Соблазн, которому не надо поддаваться

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

Это ловушка, и вот почему.

Световой движок — не хранилище значений, а машина, которая каждый кадр пересчитывает картину: эффекты со своими фазами, фейды со своим временем, слои параллельных кью-листов, гранд-мастер. Чтобы резерв «просто продолжил», он должен воспроизвести не данные, а фазу выполнения: в какой миллисекунде находится фейд, на каком угле сидит синус радуги, какой слой перебивает какой.

Синхронизировать это по сети — значит написать второй световой движок, живущий внутри протокола. И этот второй движок обязательно разойдётся с первым: где-то пакет потеряется, где-то тик придёт на 3 мс позже, и расхождение будет накапливаться ровно до того момента, когда оно понадобится.

Что переносим вместо этого

Результат кадра. Основной пульт десять раз в секунду отправляет резерву свой выходной буфер — ровно те байты, которые уходят в приборы. Никакой механики, никаких фаз: картинка как она есть.

Резерв её не выводит. Он молчит — не отдаёт ни байта ни в USB, ни в сеть — и просто запоминает последний кадр. В момент подхвата он выставляет его и продолжает жить дальше уже своей логикой.

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

Сердцебиение идёт отдельно, четыре раза в секунду. Тишина дольше двух секунд (восемь пропущенных ударов) — сигнал к подхвату. Порог настраивается, но уменьшать его ниже секунды не стоит: сетевой всплеск на выгрузке контента даст ложное срабатывание, а два пульта, одновременно пишущие в линию, хуже, чем секунда задержки.

Чего одного кадра не хватает

Картину мы перенесли. Но представьте: основной умер на кью 47, резерв подхватил, свет правильный. Оператор жмёт GO — и попадает на кью 12, потому что резерв всё это время стоял там, где его оставили.

Поэтому отдельно от картины едет позиция шоу: активный кью-лист и кью в нём, гранд-мастер, blackout, Freeze. Она применяется в момент подхвата — и применяется без повторного прогона кью. Свет уже правильный; запустить кью заново означало бы дать лишний фейд на глазах у зала.

Это два разных потока данных, и они честно разделены: «что на сцене» и «где мы в шоу».

Обвязка: без неё схема не работает

Самая частая ошибка новичка — воткнуть в каждый компьютер по USB-DMX и свести их в одну линию.

Так нельзя. RS-485 — это шина, на которой в каждый момент говорит ровно один передатчик. Два интерфейса, пишущие одновременно, физически борются за уровень на витой паре; арбитража в DMX512 не предусмотрено вовсе. Результат — не «побеждает последний», а мусор на линии и приборы, которые дёргаются.

Рабочая схема одна: оба пульта отдают свет по сети (Art-Net или sACN) на общие узлы. Резерв в сети молчит, поэтому узел видит единственного отправителя — никакой борьбы, никакого арбитража не нужно.

Если вы всё-таки на USB, резервирование даёт вам только быстрый ручной перезапуск: выдернуть интерфейс из мёртвого компьютера и воткнуть в живой. Это тоже сценарий, но его надо отрепетировать, а не обнаружить.

Возврат управления — только руками

Основной ожил. Резерв это слышит — сердцебиение снова идёт. И ничего не делает.

Автовозврата нет сознательно. Момент, когда основной «уже жив», но ещё догружает проект или переподключает интерфейс, ничем не отличается по сети от момента, когда он готов. Автоматика вернёт управление в первую же секунду — и вы получите либо провал, либо двух отправителей одновременно.

Поэтому возвращает человек: убедился, что основной действительно вернулся, нажал «Вернуть управление» на резерве. Одна кнопка, зато в понятный момент.

Чего резерв не умеет

Работающие эффекты и незавершённый фейд на подхвате не продолжатся. Резерв возьмёт последний кадр как он есть — статикой. Если основной умер ровно в середине десятисекундного фейда, фейд не доедет: картина останется на той точке, где её застало.

Это прямое следствие решения «переносим результат, а не механику», и менять его я бы не стал: статичная правильная картина лучше, чем рассинхронизированная динамическая.

Позиция кью-листа при этом переносится, так что следующий GO уйдёт туда же, куда ушёл бы у основного, и фейд в новую кью пойдёт нормально.

Зеркало кадра, кстати, не включается на схемах шире 64 вселенных: там трафик растёт быстрее пользы. Сердцебиение при этом продолжает работать — резерв подхватит, но начнёт со своей картины, а не с чужой.

Проверка перед показом, четыре шага

  1. Роли расставлены, порт одинаковый: у резерва в настройках горит «Основной пульт жив».
  2. Резерв показывает «В ожидании (молчит)» — и приборы действительно слушают только основной. Проверьте, а не поверьте.
  3. Выключите основной. За пару секунд резерв переходит в «Отдаёт свет», и картина на сцене не меняется. Если моргнуло — разбирайтесь сейчас.
  4. Включите основной, нажмите «Вернуть управление». Свет остался, отдаёт снова основной.

Четвёртый шаг пропускают чаще всего — и узнают о проблеме в тот вечер, когда основной действительно упал.

Читайте также