2010-05-22 14 views
5

Ho il mio programma di disegno in atto, con una varietà di "strumenti di disegno" come penna, gomma, Rettangolo, Cerchio, Select, Testo eccCreazione disegno lavagna collaborativa applicazione

E 'fatta con Python e wxPython . Ogni strumento menzionato sopra è una classe, che ha tutti metodi polimorfici, come left_down(), mouse_motion(), hit_test(), ecc. Il programma gestisce un elenco di tutte le forme disegnate - quando un utente ha disegnato una forma, viene aggiunta alla lista. Questo è usato anche per gestire le operazioni di annullamento/ripetizione.

Quindi, ho una base di codice decente in cui posso collegare il disegno collaborativo. Ogni forma può essere cambiata per conoscere il suo proprietario - l'utente che l'ha disegnata e per consentire solo le operazioni di eliminazione/spostamento/ridimensionamento da eseguire su forme possedute da una persona.

Mi chiedo solo il modo migliore per svilupparlo. Una persona nella "sessione" dovrà agire come server, non ho soldi per offrire server centrali gratuiti. In qualche modo gli utenti avranno bisogno di un modo per connettersi ai server, cioè un qualche tipo di browser "discover servers" ... o qualcosa del genere. Come trasmetto le modifiche apportate all'applicazione? Disegnare in tempo reale e trasmettere un messaggio su ogni evento di movimento del mouse sarebbe costoso in termini di prestazioni e le cose peggioreranno più gli utenti ci saranno in un dato momento.

Tutte le idee sono benvenute, io non sono troppo sicuro dove cominciare con lo sviluppo di questo (o anche come prova di esso)

+0

voglio assolutamente dare un'occhiata al sorgente quando hai finito di pitone, sto cominciando, me stesso. –

+0

http://launchpad.net/whyteboard guardare sotto "rami" –

risposta

10

Fare qualsiasi tempo reale di collaborazione strumento/gioco si riduce a sincronizzare in modo efficiente i cambiamenti su una struttura di dati condivisa minima tra i clienti. La larghezza di banda della rete è il collo di bottiglia. Invia solo le informazioni assolutamente necessarie per sincronizzare i dati condivisi. Sei sulla strada giusta memorizzando le forme invece dei singoli pixel. Tuttavia, le forme non dovrebbero gestire gli eventi del mouse. Come hai notato, la trasmissione di eventi del mouse saturerà rapidamente la larghezza di banda della rete! Invece, passa delta di come le forme sono alterate dagli eventi del mouse. Ad esempio, invece di inviare mouse_motion(), invia la posizione finale [x, y] dopo che una forma è stata spostata.

Suggerisco di suddividere il programma di disegno in una parte server e una parte client. Il server mantiene la versione autorevole dei dati condivisi. Un client non manipola mai direttamente la struttura di dati condivisa; invia solo messaggi di rete al server. Questo può sembrare sciocco quando sia il client e il server sono nello stesso processo/PC, ma ci sono alcune buone ragioni:

  1. percorso di codice in comune sia per il singolo utente e multi-utente
  2. La rete in testa tra un client e un server nello stesso processo sono prossimi allo zero quando si utilizzano socket locali

Inoltre, la modifica non deve essere limitata al proprietario di quella forma. Poiché il server è l'autorità finale, risolve eventuali conflitti quando due persone afferrano la stessa forma contemporaneamente e inviano i risultati ai client. (. Undo diventa un po 'difficile, però)

Anche se un server centralizzato che è meglio per il rilevamento di rete, i clienti possono utilizzare altri metodi per trovare un server:

  1. Invia o ascoltare per la rete broadcast packets.
  2. Connessione diretta tramite un indirizzo IP. (L'indirizzo IP del server dovrà essere comunicato tramite altri mezzi: chat, cellulare, urlando attraverso la stanza, piccione viaggiatore, ...

Infine, guarda come sono progettate altre applicazioni multiutente. Ecco alcuni esempi:

  • Zoidcom Multi-player programmazione del gioco libary (C++). Gran parte di questa risposta si basa sulle informazioni fornite dalla documentazione di Zoidcom. Esistono anche programmi di esempio che dimostrano la scoperta del server tramite trasmissione di rete.
  • Operational Transformation algoritmo dietro Wave, Google Documenti. (articolo discussion su Hacker News)
  • Etherpad Editor di testo collaborativo in tempo reale open source.
  • Source Multiplayer Networking Spiega come è progettato un FPS come HAlf-life. Ottiene trucchi per ridurre ritardo/latenza.
  • Google Wave (A quanto pare la documentazione è piuttosto scarsa stil ...)
+0

grazie per una risposta molto informativa. –

Problemi correlati