创建协作白板绘图应用程序

时间:2010-05-22 18:56:10

标签: python wxpython twisted paint whiteboard

我有自己的绘图程序,有各种“绘图工具”,如钢笔,橡皮擦,矩形,圆形,选择,文本等。

它是用Python和wxPython制作的。上面提到的每个工具都是一个类,它们都有多态方法,例如left_down(),mouse_motion(),hit_test()等。程序管理所有绘制形状的列表 - 当用户绘制形状时,它被添加到列表。这也用于管理撤消/重做操作。

所以,我有一个不错的代码库,我可以将协作绘图挂钩。可以更改每个形状以了解其所有者 - 绘制它的用户,并且仅允许对一个人拥有的形状执行删除/移动/重新缩放操作。

我只是想知道开发这个的最好方法。 “会话”中的一个人将不得不充当服务器,我没有钱提供免费的中央服务器。不知何故,用户需要一种连接服务器的方式,这意味着某种“发现服务器”浏览器......或其他东西。如何广播对应用程序所做的更改?实时绘制并在每个鼠标运动事件上​​广播消息在性能方面成本很高,而且在给定时间内用户越多,情况越糟。

欢迎提出任何想法,我不太确定从哪里开始(甚至如何测试)

1 个答案:

答案 0 :(得分:11)

制作任何实时协作工具/游戏都可以归结为在客户端之间有效地同步最小共享数据结构上的更改。网络带宽是瓶颈。仅发送同步共享数据所需的绝对信息。通过存储形状而不是单个像素,您处于正确的轨道上。但是,形状不应该处理鼠标事件。如您所述,广播鼠标事件将迅速使网络带宽饱和!相反,传递鼠标事件如何改变形状的增量。例如,代替发送mouse_motion(),在移动一个形状后发送最终位置[x,y]。

我建议将绘图程序拆分为服务器部分和客户端部分。服务器保留共享数据的权威版本。客户端从不直接操作共享数据结构;它只向服务器发送网络消息。当客户端和服务器都在同一个进程/ PC中时,这看起来很愚蠢,但有一些很好的理由:

  1. 单用户和多用户的共享代码路径
  2. 使用本地套接字时,同一进程中客户端和服务器之间的网络开销接近于零
  3. 此外,编辑不必仅限于该形状的所有者。由于服务器是最终权限,当两个人同时获取相同的形状并将结果发送回客户端时,它解决了任何冲突。 (但是撤消有点棘手。)

    虽然集中式服务器最适合网络发现,但客户端可以使用其他方法查找服务器:

    1. 发送或收听网络broadcast packets
    2. 通过IP地址直接连接。 (服务器IP地址必须通过其他方式进行通信:聊天,手机,在房间里喊叫,信鸽......)。
    3. 最后,看看如何设计其他多用户应用程序。以下是一些示例:

      • Zoidcom多人游戏编程库(C ++)。大部分答案都是基于Zoidcom文档中的信息。甚至还有示例程序通过网络广播演示服务器发现。
      • Wave,Google Docs背后的
      • Operational Transformation算法。 (关于黑客新闻的文章discussion
      • Etherpad开源实时协作文本编辑器。
      • Source Multiplayer Networking解释如何设计像生命一样的FPS。获取减少延迟/延迟的技巧。
      • Google Wave(显然文档很差......)