Плагин Syncker
Syncker - это многоканальная система визуализации, которая упрощает создание иммерсивной системы CAVE или крупномасштабной видеостены на базе компьютерного кластера, синхронизированной по сети в режиме реального времени.
ЭТО НЕ MULTIPLAYER РЕШЕНИЕ!
Для создания многопользовательского приложения в настоящее время следует использовать стороннее решение.
Просто подключите несколько компьютеров к одному бесшовному дисплею с высоким разрешением по локальной сети. И не имеет значения, работают ли эти компьютеры на Windows и Linux одновременно, поскольку Syncker работает даже на разных платформах. Более того, созданные виртуальные среды могут иметь любую конфигурацию монитора, поскольку все вьюпорты полностью настраиваются и поддерживаются сетки с несколькими мониторами на компьютерах Slave.
Более того, Syncker предлагает вам гибкую настройку всего процесса синхронизации на основе пользовательских сообщений . Вместо отправки всего набора данных трансформаций для объектов, которые можно только повернуть, или отправки огромных объемов данных трансформаций для всех частей сложных объектов, когда их положение можно определить с помощью всего лишь нескольких простых параметров, вы можете отправить один кватернион или набор параметров.
Смотрите также#
- Статью Запуск Syncker для пользовательского проекта для более подробной информации о коде инициализации и синхронизации Syncker.
- Статью Параметры Syncker для более подробной информации о параметрах командной строки Syncker и консольных командах.
- Статью Вывод на видеостены с подключаемым модулем Wall статья для более подробной информации об использовании плагина Wall для многомониторных конфигураций Slave.
Syncker API:
- Подробнее об управлении Syncker с помощью кода (C ++, C #, UnigineScript) см. В статье об интерфейсе Manager.
- Подробнее об управлении Syncker Master с помощью кода (C ++, C #, UnigineScript) см. В статье об интерфейсе Master.
- Подробнее об управлении Syncker Slave с помощью кода (C ++, C #, UnigineScript) см. В статье об интерфейсе Slave.
Структура и принципы#
Syncker позволяет отображать мир на разных компьютерах, синхронизированных по локальной сети. Эти компьютеры могут быть двух типов:
Master |
Приложение Master - это приложение, работающее на главном компьютере. Помимо рендеринга, он также выполняет анимацию и вычисления физики, а также управляет приложениями Slave. Главный компьютер должен иметь самую мощную конфигурацию оборудования, так как он выполняет оснувную часть вычислений.
Все остальные приложения синхронизируются с Master. |
---|---|
Slave |
Приложения Slave - это все остальные приложения, работающие на компьютерах, подключенных к сети. К одному Master может быть подключено неограниченное количество приложений Slave (если позволяет пропускная способность сети). Цель таких приложений - визуализировать все узлы, которые видны в их вьюпортах.
Конфигурация Slave настроена так, чтобы соответствовать конфигурация мониторов . |
Порядок запуска#
Порядок запуска приложений Master и Slave значения не имеет: вы можете запустить несколько приложений Slave, затем Master, а затем остальные приложения Slave - синхронизация начнется автоматически. Master запускает сеанс, как только все приложения Slave подключены.
Если присутствует только Master (-sync_count 1) и включено подключение дополнительных приложений Slave на лету (-sync_allow_extra_slaves 1), сеанс начинается немедленно и продолжается пока включен Master.
Синхронизация#
Syncker работает в асинхронном режиме , обеспечивая синхронизацию между каналами посредством реконструкции с использованием данных предыдущих кадров. В асинхронном режиме все компьютеры рисуют свои собственные кадры, каждый со своей частотой кадров. Итак, в этом режиме мы синхронизируем время.
В случае, если используется много приложений Slave, что приводит к значительному увеличению нагрузки на сеть, рекомендуется попытаться снизить нагрузку, включив режимы адресации broadcast или multicast. Если изменение режима адресации не решает проблему, рекомендуется настроить скорость отправки, параметры интерполяции / экстраполяции.
UNIGINE Syncker использует Interpolated Snapshots (IS) для решения проблемы потери пакетов между Master и Slave. Он работает, беря две старые, но известные позиции и интерполируя объект между ними. Это достигается за счет наличия буфера полученных позиций и поворотов, а также времени, которое они представляют. Обычно мы берем наше текущее местное время за вычетом некоторой предопределенной величины - периода интерполяции (по умолчанию 40 мс), затем заходим в наш буфер, находим два индекса, которые находятся непосредственно перед и сразу после этого времени, и интерполируем.
Если у нас нет полученной позиции и поворота на время, которое мы ищем, используется экстраполяция (предположение). Он также имеет ограниченный период экстраполяции по времени (по умолчанию 200 мс). Если период экстраполяции закончился, но пакеты все еще не получены, все объекты «заморозятся».
В большинстве случаев этот метод обеспечивает очень точное представление мира для каждого Slave, поскольку обычно отображаются только уже известные положения удаленных объектов, и в редких случаях система будет пытаться экстраполировать (угадать), где находится объект. Однако за это приходится платить, так как мы всегда отображаем на 40 мс (период интерполяции) отстает от текущего времени, так что новые пакеты успевают прибыть с данными.
Двусторонняя связь#
Slave не молчит, он может отправлять сообщения в Master, он может даже управлять Master, а также другими приложениями Slave (например, запускать профилировщик на всех компьютерах или закрывать все приложения), отправляя команду sync.
Для отправки и получения сообщений между Master и Slave, Syncker использует один сокет UDP со следующими пятью технологиями:
- Reliable - гарантирует доставку пакетов с использованием так называемых пакетов подтверждения. Когда Master отправляет сообщение, Slave сообщает, что сообщение получено. В случае, если Slave не отвечает в течение определенного периода времени, Master пытается повторно отправить сообщение.
- Sequenced - гарантирует получение всех пакетов в правильном порядке с обнаружением всех дубликатов. У каждого пакета есть номер, и пока Slave не получит пакет, Master не будет отправлять ему следующие (с большими номерами).
- Merged - маленькие сообщения объединяются в большее, вместо того, чтобы отправлять их все одно за другим (отправьте один 100-байтовый пакет, вместо 10 пакетов по 10 байтов каждый). Это упрощает и ускоряет отправку пакетов подтверждения отправителю.
- Fragmented - большое сообщение, превышающее размер MTU (Maximum Transmission Unit), должно быть разбито на несколько пакетов, имеющих размер MTU. Это обеспечивает доставку всех пакетов, защищая Slave от переполнения буфера, вызванного одним большим пакетом.
- Compressed - все сообщения перед отправкой сжимаются по алгоритму LZ4. Это снижает нагрузку на сеть, но немного увеличивает нагрузку на сам компьютер.
Итак, вот как доставляются пакеты:
- Во время кадра до точки синхронизации данных Master подготавливает сообщения к отправке и помещает их в очередь. Это «большое сообщение» сжимается, разбивается на части в соответствии с размером MTU, упаковывается в пакеты со следующими тремя числами, указанными для каждого из них: порядковый номер (группа пакетов), номер фрагмента и общее количество фрагментов в этой последовательности.
- Пакеты отправлены.
- При получении любого из пакетов Slave изменяет размер своего скользящего окна в соответствии с количеством фрагментов и добавляет полученный фрагмент в это окно.
- В случае пропущенных / потерянных пакетов Slave добавляет соответствующую информацию об отсутствующей части, которую он запрашивает для повторной отправки, в пакет подтверждения, отправленный на Master.
Режимы доставки#
В принципе, вы можете использовать следующие режимы доставки для отправки / получения сообщений:
- Reliable - Надежный и последовательный режим, включен по умолчанию. Все пакеты должны быть доставлены получателю в том порядке, в котором они были отправлены.
-
Unreliable - Чистый UDP. Пакеты могут быть потеряны, дублированы или получены в порядке, отличном от того, в котором они были отправлены. Пакеты не сжимаются, не фрагментируются и не объединяются. Все отправляется «как есть». Этот режим самый быстрый, так как не требует дополнительного времени на обработку. Вы можете использовать этот режим для отправки вспомогательных данных с отметками времени (например, для интерполяции), имеющих размер, близкий к MTU.
Пример : отправка 10 раз в секунду позиций 10 самолетов с информацией о текущем времени, состоянии закрылков, предкрылков, элеронов, шасси и т.д.
-
Sequenced - Пакеты могут быть потеряны, но никогда не дублируются, они прибывают в том порядке, в котором были отправлены. Этот режим можно использовать для отправки вспомогательных данных размером, близким к MTU.
Пример : отправка каждого кадра положения 10 самолетов с информацией о состоянии закрылков, предкрылков, элеронов, шасси и т.д.
Несколько систем могут использовать сеть Syncker одновременно (например, IG и приложение пользователя App). Для удобства все сообщения отправляются и принимаются по именованным каналам. Если указанный канал не существует, он должен быть создан.
Режимы адресации#
Доступны следующие режимы адресации для связи:
В зависимости от требований вашего проекта вы можете выбрать тот, который лучше всего подходит: обеспечивает минимально возможную нагрузку или предоставляет дополнительные функции, такие как простое тестирование на одном ПК или обмен данными между хостами из разных подсетей с использованием разных портов.
Сетевая нагрузка#
Обобщая информацию из приведенной выше таблицы в отношении нагрузки сетевого трафика:
- Режим Multicast генерирует минимальный сетевой трафик по сравнению с другими режимами, таким образом создавая наименьшую нагрузку на роутер и Wi-Fi.
- Режим Broadcast может быть более затратным, потому что пакеты отправляются на все сетевые ПК, включая те, которые не имеют Slave (если есть). Если в вашей сети нет других компьютеров, кроме Slave, то объем трафика будет таким же, как в режиме Multicast.
- Режим Unicast генерирует объем сетевого трафика, который можно рассчитать как Multicast * количество ПК Slave .
Для дальнейшей оптимизации загрузки трафика вы можете увеличить временные интервалы отправки пакетов:
//On the Master
master->setSendRate(15.0f); // send packets 15 times per second
//Both on the Master and all Slaves
syncker->setInterpolationPeriod(0.1f); // 100 ms delay
В этом примере пакеты будут отправляться только 15 раз в секунду, поэтому задержка составит 100 мс.
Во избежание визуального дрожания необходимо выполнение следующего условия:
interpolation period > (1 / send rate)
Следовательно, уменьшение лага (периода интерполяции) требует увеличения скорость отправки , что повлияет на загрузку сети:
//On the Master
master->setSendRate(30.0f); // send packets 30 times per second
//Both on the Master and all Slaves
syncker->setInterpolationPeriod(0.05f); // 50 ms delay
Несколько камер и Slave с несколькими мониторами#
Syncker позволяет синхронизировать виды с нескольких камер. Есть два типа камер:
-
Основная мастер-камера - отдельная камера, соответствующая положению основного зрителя. В конфигурация экрана определяет вьюпорты относительно этой камеры.
Пример: камера в кабине самолета, соответствующая точке зрения пилота.
-
Вспомогательная камера - дополнительная камера (статическая или динамическая), которую можно установить в любом месте сцены. Вы можете иметь столько камер этого типа, сколько необходимо.
Пример: наземная камера наблюдения или тепловизионная камера, установленная на крыле самолета.
По умолчанию используется основная мастер-камера. Вы можете создать дополнительные камеры и указать их вьюпорты, которые будут отображаться выбранными приложениями Slave. Такие камеры синхронизируются автоматически.
Syncker предоставляет исключительную гибкость конфигурации вьюпортов. Вы можете использовать до 6 мониторов на одном Slave, каждому из которых назначено собственный вьюпорт. Для этого следует использовать плагин Wall.
Конфигурации экрана#
Вы можете настроить желаемую конфигурацию экрана / проекции для Syncker в режим настройки экрана / проекции . Чтобы активировать этот режим, используйте консольную команду syncker_setup из Master или Slave:
syncker_setup 1
Конфигурация экрана для Syncker должна соответствовать требованиям .
Можно использовать два типа конфигурации:
-
Установка с несколькими мониторами, состоящая из дисплеев , где каждый Slave отображает свое окно просмотра на соответствующем мониторе (или нескольких мониторах).
Матрицы проекции и обзора модели автоматически рассчитываются на основе положения зрителя.На следующем рисунке показана конфигурация экрана для настройки с несколькими мониторами, где каждый Slave отображает свой вьбпорт на одном мониторе.
Конфигурация экрана (левое изображение) для настройки нескольких мониторов (правое изображение) -
Мультипроекторная установка, состоящая из проекторы , где каждый Slave отображает свое окно просмотра через соответствующий проектор. По умолчанию проекторы отображают изображения, видимые с позиции зрителя.
Конфигурация проектора (левый рисунок) для настройки нескольких проекторов (правый рисунок)Матрицы проекции и обзора модели автоматически рассчитываются на основе положения зрителя.Особым случаем настройки нескольких проекций является CAVE (автоматическая виртуальная среда пещеры):
Конфигурация проекции для CAVE
Конвейер Syncker#
Обычно Syncker имеет 4 состояния:
- Wait for connections - ожидание подключения всех Slave ПК.
- Starting... - расчет MTU и стартовая синхронизация всех хостов.
- Session Started - сессия запущена.
- Session Finished - сессия окончена, все ПК Slave отключены.
Давайте рассмотрим работу Syncker с использованием широковещательной адресации с Master и одним Slave:
- После запуска Master открывает порт (-sync_port) и начинает его слушать. Статус Syncker переключается на "Wait for connections".
- Slave получает список всех доступных сетевых адаптеров (Wifi, Ethernet), находит широковещательный адрес для каждого из них и периодически отправляет пакеты запросов на соединение (режим broadcast). Статус Syncker равен "Wait for connections".
- Master принимает пакет запроса на соединение, регистрирует Slave и отправляет пакет ответа на соединение (режим unicast), где указывает загруженный в данный момент мир. Когда все ПК Slave подключены, статус Syncker переключается на "Starting...", и Master отправляет настройки проекции всем им.
- Как только Slave получает подтверждение от Master, статус переключается на "Starting..." и начинается загрузка мира с Master.
- Пока статус Syncker остается "Starting...", и Master, и Slave пытаются найти максимально возможное значение MTU (в настоящее время ограничено 1432 байтами).
- По завершении Slave отправляет сообщение Master, что он готов к продолжению. После получения таких сообщений от всех компьютеров Slave (и нахождения MTU для каждого Slave), Master изменяет статус на "Session Started", уведомляя все хосты.
- Сессия началась, все готово к работе.
Использование Syncker#
Простая синхронизированная демонстрация#
Предположим, вы подготовили «статический» проект (это означает, что в нем не создаются новые объекты и не удаляются и не перемещаются существующие) с некоторой кинематикой. Это соответствует большинству проектов Archviz или различным типам демонстраций.
Предположим, вы хотите продемонстрировать этот проект с помощью стены или системы CAVE. Здесь должен работать Syncker, но в вашем проекте об этом нет ничего, ни единой строчки кода! Что ж, вам это не нужно, просто используйте специальный системный скрипт, который запускает Syncker! Это все, что вам нужно сделать, поскольку единственное, что движется во время кинематографического эпизода, - это камера (которая синхронизируется автоматически), а все остальные объекты статичны (нет необходимости их синхронизировать).
Это самый простой режим, вам не нужно знать IP-адреса или порты, и вам не нужно писать какой-либо код. Все, что вам нужно знать, это:
- Кто должен быть Master.
- Какое количество ПК Slave.
Затем вы просто делаете следующее:
-
Запустите приложение Master, подставив Системный сценарий выполнения со специальным (core/systems/syncker/unigine.cpp) и обеспечивающим необходимый запуск параметры командной строки чтобы определить его как Master и установить общее количество хост-компьютеров:
<your_app> -system_script core/systems/syncker/unigine.cpp -extern_plugin "Syncker" -sync_master 1 -sync_count 2
-sync_count здесь устанавливает общее количество компьютеров (Slave ПК + Master). В этом простейшем случае -sync_count 2 - означает одиночный Master и единственный Slave.
-
Запустите каждое приложение Slave, используя один и тот же системный скрипт и указав, что хост - это Slave (а не Master):
<your_app> -system_script core/systems/syncker/unigine.cpp -extern_plugin "Syncker" -sync_master 0
И все! Запускайте Master и Slave (s) в любом порядке (это не имеет значения). Slave автоматически найдет Master в сети и подключится к нему.
Базовый порядок действий#
Базовый порядок действий выглядит следующим образом:
- Реализуйте логику Syncker для ваших приложений Master и Slave (вы можете использовать одно и то же приложение для сторон Master и Slave).
-
Подготовьте свое окружение .
Рекомендуется использовать LAN 100 Мб. В противном случае могут возникнуть задержки в сети (см. Поиск проблемы раздел).
Все используемые вами приложения должны иметь доступ ко всем файлам Unigine и данным проекта. Итак, вы должны скопировать свой проект на все компьютеры. Если некоторые узлы отсутствуют в мировом файле на локальном компьютере, они не будут отображаться.
-
Запустите приложение Master.
Для запуска приложения Master необходимо обеспечить необходимый запуск параметры командной строки , например:
<your_app> -extern_plugin "Syncker" -sync_master 1 -sync_view <display_name> -sync_count <number_of_hosts>
Порядок запуска приложений Master и Slave значения не имеет. -
Запустите приложение Slave.
Для запуска приложения Slave необходимо обеспечить необходимый запуск параметры командной строки , например:
<your_app> -extern_plugin "Syncker" -sync_master 0 -sync_view <display_name>
Если вы хотите, чтобы Slave с конфигурацией с несколькими мониторами отображал несколько окон просмотра, вы должны использовать плагин Wall и назначить окна просмотра для мониторов с помощью параметров sync_view_n, например:
<your_app> -extern_plugin "Wall,Syncker" -sync_master 0 -sync_view_0 <display_0> -sync_view_1 <display_1>
Порядок плагинов в списке имеет значение: Wall должен быть указан перед Syncker. - Настройте конфигурации экранов / проекций . Этот шаг выполняется, когда все хосты Syncker успешно подключены и работают.
Окно отладки (Debug)#
Окно отладки Syncker позволяет вам контролировать иерархию объектов во время выполнения. Под всей иерархией понимаются все объекты (не только зарегистрированные в Редакторе), включая объекты в кеше, внутреннюю структуру ссылки на узлы и т.д. Когда узел выбран, отображается вся необходимая отладочная информация. Эта информация обновляется каждый кадр.
Параметр Search позволяет найти любой узел по его имени или идентификатору (на Master или Slave), поэтому неисправный узел можно найти быстро.
Чтобы открыть окно отладки, запустите консольную команду syncker_debug из Master или Slave следующим образом:
syncker_debug 1
Окно отладки также можно открыть через System Menu:
- Откройте System Menu, нажав Esc.
-
Включите опцию Show debug window:
Откроется окно отладки:
Поиск и устранение неполадок#
Slave не может подключиться к Master#
Консоль должна выглядеть так:
Slave периодически отправляет широковещательные сообщения при попытке найти отвечающий Master, но ответа нет. Сообщения не доходят до Master.
Решения:
- Убедитесь, что порт, используемый Slave для отправки / получения сообщений (Slave UDP port), не заблокирован брандмауэром на Master. Попробуйте отключить брандмауэры на Master и всех ПК с Slave.
- Убедитесь, что широковещательные / многоадресные сообщения не блокируются маршрутизатором / коммутатором. Маловероятно, но все же возможно.
-
Попробуйте явно указать IP-адрес Master с помощью команды sync_master_address, например:
-sync_master_address 192.168.0.1
В этом случае Slave должен пропустить фазу поиска Master через широковещательные сообщения и использовать одноадресный режим для прямого подключения.
- Убедитесь, что Master действительно ждет новых подключений. Проверьте значение sync_count, оно больше 1?
Master не может ответить Slave#
В этом случае консоль будет выглядеть так:
Запросы на соединение от Slave были получены Master, соединение было открыто и сеанс был запущен, но ответ соединения не достиг Slave.
Решения:
- Убедитесь, что порт, используемый Slave для отправки / получения сообщений (Slave UDP port), не заблокирован брандмауэром. Попробуйте отключить брандмауэры на Master и всех ПК с Slave.
- Убедитесь, что сообщения broadcast/multicast не блокируются маршрутизатором / коммутатором. Маловероятно, но все же возможно.
-
Попробуйте использовать одноадресное соединение:
-sync_method unicast
-
Убедитесь, что найденный широковещательный адрес действителен, попробуйте настроить широковещательный канал для всех хостов:
-sync_broadcast_address 255.255.255.255
- Попробуйте установить другой адрес многоадресной рассылки на ПК Master и Slave с помощью команды sync_multicast_address.
- Проверьте IP / порт Slave, подключенного к Master. Это правильный Slave, или, может быть, есть другой экземпляр Slave, который ищет Master на том же порту? Попробуйте изменить номер порта на Master и Slave (например, -sync_port 25100) и перезапустите приложения.
Задержка в сети#
Если задержка в сети слишком велика, несмотря на пропускную способность 1 ГБ или выше, это может быть вызвано подключением к сети устройства на 100 или 10 МБ. Скорость обмена данными упадет до максимальной скорости, поддерживаемой таким устройством, замедляя скорость соединения Syncker.
- Некоторые устройства на 100 или 10 МБ могут иметь рабочий сетевой интерфейс в выключенном состоянии.
- Также возможно, что в выключенном состоянии устройства на 1 Гб имеют сетевой интерфейс, работающий на скорости 100 Мб, что замедляет соединение в локальной сети.
Интеграция с инструментом Microprofile позволяет отслеживать производительность, обнаруживать узкие места и устранять их.
Полезный инструмент#
Если у вас есть исходный SDK, вы можете использовать простой и полезный инструмент для отслеживания скорости обмена сетевыми сообщениями. Это server.usc, найденное в source/tools/Interpreter/scripts/network/.
Проблемные устройства#
Тестирование и эксплуатация показали, что плагин Syncker может иметь проблемы при использовании со следующим оборудованием:
- 3COM OfficeConnect Switch 5
- D-Link DES-1005D
Если возникнут проблемы, попробуйте переключиться на другое оборудование.