2010-05-22 21 views
5

Mam własny program do rysowania w miejscu, z różnych „narzędzi do rysowania”, takich jak pióro, gumka, prostokąt, koło, Select, tekst itpTworzenie współpracy tablicy rysunek aplikacja

Jest wykonana z Python i wxPython . Każde wymienione wyżej narzędzie jest klasą, która posiada wszystkie metody polimorficzne, takie jak left_down(), mouse_motion(), hit_test() itd. Program zarządza listą wszystkich rysowanych kształtów - kiedy użytkownik narysował kształt, jest on dodany do listy. Służy także do zarządzania operacjami cofania/ponawiania.

Mam przyzwoitą bazę kodów, do której mogę podłączyć rysunek zbiorczy. Każdy kształt może zostać zmieniony, aby poznać właściciela - użytkownika, który go narysował, i pozwolić tylko na wykonywanie operacji usuwania/przesuwania/przeskalowywania na kształtach należących do jednej osoby.

Po prostu zastanawiam się, jak najlepiej to rozwinąć. Jedna osoba w "sesji" będzie musiała działać jako serwer, nie mam pieniędzy, by oferować darmowe centralne serwery. W jakiś sposób użytkownicy będą potrzebowali sposobu na połączenie się z serwerami, czyli jakiejś przeglądarki "odkryj serwery" ... lub coś w tym stylu. Jak rozgłaszać zmiany wprowadzone w aplikacji? Rysowanie w czasie rzeczywistym i nadawanie komunikatu na każdym ruchu myszy byłoby kosztowne pod względem wydajności, a rzeczy się pogarszają, im więcej użytkowników jest w danym momencie.

Wszelkie pomysły są mile widziane, nie jestem zbyt pewny gdzie zacząć rozwija ten (lub nawet jak go przetestować)

+0

pewno chcesz spojrzeć na źródła kiedy skończysz, Zaczynam Python, sam. –

+0

http://launchpad.net/whyteboard Spójrz na "oddziały" –

Odpowiedz

10

dokonywania jakichkolwiek czasie rzeczywistym współpracy narzędzia/gra sprowadza się do efektywnego synchronizacji zmian na minimalna wspólna struktura danych między klientami. Przepustowość sieci jest wąskim gardłem. Wysyłaj tylko informacje absolutnie niezbędne do synchronizacji udostępnianych danych. Jesteś na dobrej drodze, przechowując kształty zamiast pojedynczych pikseli. Jednak kształty nie powinny obsługiwać zdarzeń myszy. Jak zauważyłeś, transmisje zdarzeń myszy szybko nasycą przepustowość sieci! Zamiast tego przepuść delty, jak kształty są zmieniane przez zdarzenia myszy. Na przykład, zamiast wysłać mouse_motion() wyślij ostateczną pozycję [x, y] po przeniesieniu kształtu.

Sugeruję podzielenie programu do rysowania na część serwerową i część klienta. Serwer zachowuje autorytatywną wersję udostępnianych danych. Klient nigdy nie manipuluje bezpośrednio strukturą danych udostępnionych; wysyła tylko komunikaty sieciowe do serwera. Może to wydawać się głupie, gdy zarówno klient, jak i serwer znajdują się w tym samym procesie/PC, ale istnieje kilka dobrych powodów:

  1. wspólna ścieżka kodu zarówno dla pojedynczego użytkownika i multi-user napowietrznych
  2. sieć łączącą klient i serwer w tym samym procesie zbliża się do zera przy użyciu lokalnych gniazdek

Ponadto edycja nie musi być ograniczona do właściciela tego kształtu. Ponieważ serwer jest ostatecznym autorytetem, rozwiązuje wszelkie konflikty, gdy dwie osoby chwytają ten sam kształt jednocześnie i wysyłają wyniki z powrotem do klientów. (. Cofnij robi się trochę skomplikowane, choć)

Chociaż serwer scentralizowany jest najlepszy do wykrywania sieci, klienci mogą korzystać z innych metod, aby znaleźć serwer:

  1. Wyślij lub słuchać sieci broadcast packets.
  2. Podłącz bezpośrednio za pomocą adresu IP. (Adres IP serwera będzie musiał być przekazany w inny sposób: czat, telefon komórkowy, krzycząc przez pokój, gołąb przewoźnik, ...)

Wreszcie, zobacz, jak projektowane są inne aplikacje dla wielu użytkowników. Oto kilka przykładów:

  • Zoidcom Multi-player gra libary programowania (C++). Większość tej odpowiedzi opiera się na informacjach z dokumentacji Zoidcom. Istnieją nawet przykładowe programy, które demonstrują odnajdywanie serwerów za pośrednictwem transmisji sieciowych.
  • Operational Transformation Algorytm za falą, Google Docs. (artykuł discussion na Hacker News)
  • Etherpad Współdzielony edytor tekstu w czasie rzeczywistym.
  • Source Multiplayer Networking Wyjaśnia, w jaki sposób zaprojektowany jest FPS, taki jak HAlf-life. Pobiera triki, by zmniejszyć opóźnienie/opóźnienie.
  • Google Wave (Najwyraźniej dokumentacja jest stil dość słaba ...)
+0

dzięki za bardzo pouczającą odpowiedź. –