Question

J'ai mon propre programme de dessin en place, avec une variété de « outils de dessin » comme stylo, gomme à effacer, Rectangle, Cercle, Sélection, texte etc.

Il est fait avec Python et wxPython. Chaque outil mentionné ci-dessus est une classe, qui ont toutes les méthodes polymorphes, comme left_down (), Mouse_motion (), hit_test (), etc. Le programme gère une liste de toutes les formes dessinées - lorsqu'un utilisateur a dessiné une forme, il est ajouté à la liste. Il est utilisé pour gérer undo / redo opérations aussi.

Alors, j'ai une bonne base de code que je peux accrocher le dessin collaboratif en. Chaque forme peut être modifiée pour connaître son propriétaire -. L'utilisateur qui l'a dessiné, et seulement permettre supprimer / déplacer / opérations à effectuer Mettre à l'échelle des formes appartenant à une personne

Je me demande la meilleure façon de développer ce. Une personne dans la « session » devra agir en tant que serveur, je n'ai pas d'argent pour offrir des serveurs centraux gratuitement. D'une certaine manière les utilisateurs auront besoin d'un moyen de se connecter à des serveurs, ce qui signifie une sorte de navigateur « découvrir les serveurs » ... ou quelque chose. Comment puis-je diffuser les modifications apportées à l'application? Dessin en temps réel et la diffusion d'un message sur chaque événement de mouvement de la souris serait coûteuse en termes de performance et les choses empirent plus les utilisateurs, il y a à un moment donné.

Toutes les idées sont les bienvenues, je ne suis pas trop sûr où commencer à développer ce (ou même comment le tester)

Était-ce utile?

La solution

Faire un outil de collaboration en temps réel / jeu se résume à efficacement la synchronisation des modifications sur une structure de données partagée minimale entre les clients. bande passante réseau est le goulot d'étranglement. Envoyer uniquement les informations absolument nécessaires pour synchroniser les données partagées. Vous êtes sur la bonne voie en stockant des formes au lieu de pixels individuels. Cependant, les formes ne doivent pas gérer les événements de souris. Comme vous l'avez dit, les événements de souris de diffusion satureront rapidement la bande passante du réseau! Au lieu de cela, passer deltas de la façon dont les formes sont modifiées par les événements de la souris. Par exemple, au lieu d'envoyer Mouse_motion () envoyer la position finale [x, y] après une forme a été déplacée.

Je suggère diviser votre programme de dessin dans une partie de la partie serveur et le client. Le serveur conserve la version officielle des données partagées. Un client ne manipule la structure de données partagées directement; il envoie uniquement les messages du réseau au serveur. Cela peut sembler ridicule quand le client et le serveur sont dans le même processus / PC, mais il y a quelques bonnes raisons:

  1. chemin de code partagé pour à la fois mono-utilisateur et multi-utilisateurs
  2. Le produit de tête de réseau entre un client et un serveur dans le même processus est proche de zéro lors de l'utilisation des prises locales

En outre, l'édition ne doit pas se limiter au propriétaire de cette forme. Étant donné que le serveur est l'autorité finale, il résout tout conflit lorsque deux personnes saisissent de nouveau aux clients la même forme simultanément et envoyer les résultats. (Annuler devient un peu difficile, cependant.)

Bien qu'un serveur centralisé est le meilleur pour la découverte de réseau, les clients peuvent utiliser d'autres méthodes pour trouver un serveur:

  1. Envoyer ou écouter réseau .
  2. Connectez-vous directement via une adresse IP. (L'adresse IP du serveur devra être communiqué par d'autres moyens: chat, téléphone cellulaire, criant à travers la pièce, pigeon voyageur, ...)

Enfin, regardez comment les autres applications multi-utilisateurs sont conçus. Voici quelques exemples:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top