Создание любого инструмента / игры для совместной работы в реальном времени сводится к эффективной синхронизации изменений минимальной общей структуры данных между клиентами. Узким местом является пропускная способность сети. Отправляйте только информацию, абсолютно необходимую для синхронизации общих данных. Вы на правильном пути, сохраняя формы вместо отдельных пикселей. Однако фигуры не должны обрабатывать события мыши.Как вы заметили, широковещательная передача событий мыши быстро снижает пропускную способность сети! Вместо этого передайте дельты того, как формы изменяются событиями мыши. Например, вместо отправки mouse_motion () отправьте конечную позицию [x, y] после перемещения фигуры.
Я предлагаю разделить вашу программу рисования на серверную и клиентскую части. Сервер хранит официальную версию общих данных. Клиент никогда не манипулирует общей структурой данных напрямую; он отправляет на сервер только сетевые сообщения. Это может показаться глупым, если и клиент, и сервер находятся в одном процессе / ПК, но на то есть несколько веских причин:
Кроме того, редактирование не должно ограничиваться владельцем этой формы. Поскольку сервер является последней инстанцией, он разрешает любые конфликты, когда два человека одновременно берут одну и ту же форму и отправляют результаты обратно клиентам. (Отменить действие, однако, немного сложно.)
Хотя централизованный сервер лучше всего подходит для обнаружения сети, клиенты могут использовать другие методы для поиска сервера:
Наконец, посмотрите, как устроены другие многопользовательские приложения. Вот несколько примеров: