2010-05-22 15 views
5

J'ai mon propre programme de dessin en place, avec une variété de « outils de dessin » tels que stylo, gomme à effacer, Rectangle, Cercle, Select, texte, etc.Création d'applications dessin collaboratif de tableau blanc

Il est fait avec Python et wxPython . Chaque outil mentionné ci-dessus est une classe, qui a tous des méthodes polymorphes, comme left_down(), mouse_motion(), hit_test() etc. Le programme gère une liste de toutes les formes dessinées - quand un utilisateur a dessiné une forme, il est ajouté à la liste. Ceci est utilisé pour gérer les opérations annuler/rétablir aussi. Donc, j'ai une bonne base de code dans laquelle je peux accrocher le dessin collaboratif. Chaque forme peut être modifiée pour connaître son propriétaire - l'utilisateur qui l'a dessinée et pour autoriser uniquement les opérations de suppression/déplacement/redimensionnement sur des formes appartenant à une personne.

Je me demande juste la meilleure façon de développer cela. Une personne dans la "session" devra faire office de serveur, je n'ai pas d'argent pour offrir des serveurs centraux gratuits. D'une certaine façon, les utilisateurs auront besoin d'un moyen de se connecter aux serveurs, ce qui signifie une sorte de "découvrir les serveurs" navigateur ... ou quelque chose. Comment puis-je diffuser les modifications apportées à l'application? Dessiner en temps réel et diffuser un message sur chaque mouvement de souris serait coûteux en termes de performance et les choses empirent au fur et à mesure que le nombre d'utilisateurs augmente.

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)

+0

Je veux vraiment jeter un oeil à votre source lorsque vous avez terminé, je commence python, moi-même. –

+0

http://launchpad.net/whyteboard regardez sous "branches" –

Répondre

10

Faire un outil/jeu collaboratif en temps réel se résume à synchroniser efficacement les changements sur une structure de données partagées minimale entre les clients. La 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 la souris. Comme vous l'avez noté, la diffusion des événements de la souris va rapidement saturer la bande passante du réseau! Au lieu de cela, passez 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(), envoyez la position finale [x, y] après le déplacement d'une forme.

Je suggère de diviser votre programme de dessin en une partie serveur et une partie client. Le serveur conserve la version faisant autorité des données partagées. Un client ne manipule jamais directement la structure de données partagée. il envoie uniquement des messages 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 les deux mono-utilisateur et multi-utilisateurs
  2. Les frais généraux du réseau entre un client et un serveur dans le même processus sont proches de zéro lors de l'utilisation des sockets locaux

De plus, l'édition ne doit pas nécessairement être limitée au propriétaire de cette forme. Puisque le serveur est l'autorité finale, il résout tout conflit lorsque deux personnes saisissent simultanément la même forme et envoient les résultats aux clients. (. Annuler est un peu délicat, cependant)

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

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

Enfin, regardez comment d'autres applications multi-utilisateurs sont conçues. Voici quelques exemples:

  • Zoidcom libary de programmation de jeu multi-joueurs (C++). Une grande partie de cette réponse est basée sur les informations de la documentation de Zoidcom. Il existe même des exemples de programmes qui démontrent la découverte de serveur via la diffusion réseau.
  • Operational Transformation algorithme derrière Wave, Google Docs. (article discussion sur Hacker News)
  • Etherpad Éditeur de texte collaboratif en temps réel open-source.
  • Source Multiplayer Networking Explique comment un FPS comme HAlf-life est conçu. Obtient des astuces pour réduire le retard/latence.
  • Google Wave (Apparemment, la documentation est Stil assez pauvre ...)
+0

merci pour une réponse très informative. –