6

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

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

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

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

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

4

1 回答 1

14

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

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

  1. 单用户和多用户的共享代码路径
  2. 使用本地套接字时,同一进程中客户端和服务器之间的网络开销几乎为零

此外,编辑不必仅限于该形状的所有者。由于服务器是最终权威,因此当两个人同时抓取相同的形状并将结果发送回客户端时,它可以解决任何冲突。(不过,撤消有点棘手。)

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

  1. 发送或收听网络广播数据包
  2. 通过 IP 地址直接连接。(服务器 IP 地址必须通过其他方式进行通信:聊天、手机、在房间里大喊大叫、信鸽……)

最后,看看其他多用户应用程序是如何设计的。这里有些例子:

于 2010-05-22T21:12:09.697 回答