2010-05-22 88 views
5

我有我自己的繪圖程序到位,有各種各樣的「繪圖工具」,如筆,橡皮擦,矩形,圓形,選擇,文本等創建協作白板繪圖應用程序

它使用Python和wxPython的製作。上面提到的每個工具都是一個類,它們都具有多態方法,例如left_down(),mouse_motion(),hit_test()等。該程序管理所有繪製形狀的列表 - 當用戶繪製了形狀時,它被添加到名單。這也用於管理撤消/重做操作。

因此,我有一個體面的代碼庫,我可以將協作繪圖連接到。每個形狀都可以改變,以瞭解它的所有者 - 繪製它的用戶,並且只允許在一個人擁有的形狀上執行刪除/移動/重新縮放操作。

我只是想知道開發這個最好的方法。 「會話」中的一個人將不得不充當服務器,我沒有錢提供免費的中央服務器。不知何故,用戶需要一種連接到服務器的方式,這意味着某種「發現服務器」瀏覽器......或其他東西。如何廣播對應用程序所做的更改?實時繪製並在每個鼠標動作事件上廣播消息在性能方面會代價很高,並且在給定時間內用戶越多,情況就越糟糕。

任何想法是受歡迎的,我也不太清楚,其中與發展中國家這一點(甚至是如何測試)

+0

我一定要當你做,我開始蟒蛇,自己看看你的來源。 – 2010-05-22 19:01:20

+0

http://launchpad.net/whyteboard 請看「分支機構」 – 2010-05-22 19:28:01

回答

10

進行任何實時協作工具/遊戲開始歸結到有效同步更改客戶端之間的最小共享數據結構。網絡帶寬是瓶頸。只發送絕對需要的信息來同步共享數據。通過存儲形狀而不是單個像素,您正處於正確的軌道上。但是,形狀不應該處理鼠標事件。正如你所指出的,廣播鼠標事件將迅速飽和網絡帶寬!相反,傳遞形狀由鼠標事件改變的三角形。例如,在形狀被移動後,而不是發送mouse_motion()發送最終位置[x,y]。

我建議將繪圖程序分解爲服務器部分和客戶端部分。服務器保留共享數據的權威版本。客戶端從不直接操縱共享數據結構;它只將網絡消息發送到服務器。當客戶端和服務器都在同一個進程/ PC這可能看起來很可笑,但也有一些很好的理由:

  1. 對之間的單用戶和多用戶
  2. 的網絡開銷共享代碼路徑在使用本地套接字時,同一進程中的客戶端和服務器接近於零

此外,編輯不必侷限於該形狀的所有者。由於服務器是最終權威,所以當兩個人同時抓取相同的形狀並將結果發送回客戶端時,它可以解決任何衝突。 (撤消變得有點棘手,雖然)

雖然集中式服務器是最適合網絡發現,客戶端可以使用其他方法來找到一個服務器:

  1. 發送或偵聽網絡broadcast packets
  2. 通過IP地址直接連接。 (服務器的IP地址必須通過其他方式進行通信:聊天,手機,在房間裏呼喊,傳送信鴿......)

最後,看看如何設計其他多用戶應用程序。這裏有一些例子:

  • Zoidcom多人遊戲編程庫(C++)。這個答案大部分是基於Zoidcom文檔的信息。甚至有示例程序可以通過網絡廣播演示服務器發現。
  • Operational Transformation Wave,Google Docs背後的算法。 (關於Hacker News的文章discussion
  • Etherpad開源實時協作文本編輯器。
  • Source Multiplayer Networking解釋如何設計一個像HAlf壽命的FPS。進入降低延遲/延遲的技巧。
  • Google Wave(顯然,文檔STIL非常不好......)
+0

感謝您提供非常豐富的答案。 – 2010-05-22 21:40:09