Как работает Drawpile (бесплатная программа для совместного рисования)

Какработаетdrawpileбесплатнаяпрограммадлясовместногорисования

Этот документ описывает общий обзор того, как совместное рисование реализовано в Drawpile.

Протокол

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

Каждая команда рисования, например penmove , penup или fillrect имеет уникальный тип сообщения. История сеанса рисования – это последовательность этих команд. Историю можно записывать и воспроизводить, получая тот же конечный результат.

Обычно команды кодируются в эффективном двоичном формате, но также поддерживается текстовое кодирование. Вот краткий пример записи, которую можно открыть в Drawpile.

 ! version = dp: 4. 25. 1 1 изменить размер вправо = 275 дно = 100 1 идентификатор нового слоя = 1 заголовок = Демо 1 слой кисти = 1 1 движение пера 0 0 1 движение пера 112 275 1 подписка  

В приведенном выше примере создается 100Икс100 изображение одним слоем и проведет по нему диагональную линию. Дополнительные примеры см. В каталоге tests / .

В протоколе есть три разных типа сообщений: Control, Meta и Command.

Типы сообщений также можно разделить на прозрачные. / Непрозрачные (сообщения, которые сервер должен понимать, и те, которые он просто передает) и записываемые / не записываемые (те, которые имеет смысл хранить в записях) типы.

Управляющие сообщения – это используются для связи клиент / сервер (например, согласование данных для входа в систему, установка свойств сервера и т. д.) и не имеют отношения к рисованию.

Мета-сообщения не имеют прямого отношения к рисованию, но могут влияют на то, как фильтруются последующие команды. Они включают в себя такие вещи, как уведомления о входе пользователя и настройки управления доступом к слою.

Командные сообщения – это фактические команды рисования, которые влияют на изменения холста. (Отфильтрованная) история сеанса со всеми удаленными мета-сообщениями должна давать тот же конечный результат, что и исходный.

Сервер

Редактор для совместной работы в реальном времени имеет две проблемы, которые необходимо решить: позволить пользователю работать над своими изменениями с минимальной задержкой и как применять изменения в последовательном порядке.

Подробнее о первой проблеме позже.

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

Сам сервер довольно тупой. Ему не нужно понимать семантику (непрозрачных) сообщений, ему просто нужно добавить их в свою собственную копию истории сеанса, а затем передать эту историю всем клиентам. Недавно вошедшие в систему клиенты должны будут загрузить всю историю, чтобы наверстать упущенное.

Контроль доступа

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

Сервер отвечает за общий контроль доступа: допускать ли нового пользователя и какие пользователи считаются “владельцы сеансов”. Владельцы сеанса имеют право выполнять определенные серверные команды, недоступные обычным пользователям, такие как удаление других пользователей из сеанса или изменение названия сеанса. У них также есть некоторые права, о которых сервер не знает, которые проверяются только на стороне клиента.

^ ^ До версии 2.0 сервер действительно понимал семантика команды рисования и выполнила фильтрацию. Однако это означает, что версия сервера была очень тесно связана с версией клиента, а изменения в протоколе означали, что сервер не мог обслуживать более новые или старые версии клиентов.

Холст

Когда сообщение проходит через фильтры, оно может, наконец, отразиться на холсте. В исходном коде Drawpile этим занимается класс StateTracker . Протокол Drawpile не является полностью апатридным. Чтобы мазки кисти появлялись в реальном времени по мере их рисования, они отправляются в виде серии penmove , а не как один полный штрих пера. Итак, полный мазок кисти состоит из нескольких команд, например:

  1 слой кисти = 1 цвет = # ff 001 001 size = 2 1 penmove 0 0 1 ход пера 275 112 1 подписка  

Каждая команда имеет префикс с идентификатором пользователя. (В двоичном протоколе идентификатор является частью заголовка сообщения.) Фактическая часть холста больше не знает о нескольких пользователях, она просто знает о нескольких контекстах инструментов, поэтому идентификатор пользователя также называется идентификатором контекста. Для каждого идентификатора контекста средство отслеживания состояния запоминает следующую информацию:

Leave a comment

Your email address will not be published. Required fields are marked *

20 + 20 =