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

2024-06-25 23:06:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

所以,我有一个不错的代码库,我可以把协作绘图挂到其中。每个形状都可以更改为知道其所有者(即绘制它的用户),并且只允许对一个人拥有的形状执行删除/移动/重缩放操作。在

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

任何想法都是受欢迎的,我不太确定从哪里开始开发这个(或者如何测试它)


Tags: 工具用户文本程序服务器绘图列表方式
1条回答
网友
1楼 · 发布于 2024-06-25 23:06:29

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

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

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

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

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

  1. 发送或侦听网络broadcast packets。在
  2. 通过IP地址直接连接。(服务器IP地址必须通过其他方式进行通信:聊天、手机、房间对面的喊叫、信鸽……)

最后,看看其他多用户应用程序是如何设计的。以下是一些示例:

    Zoidcom多玩家游戏编程库(C++)。这个答案大部分基于Zoidcom文档中的信息。甚至还有一些示例程序通过网络广播演示服务器发现。在
  • Operational TransformationWave背后的算法,Google文档。(Hacker News上的文章discussion
  • Etherpad开源实时协作文本编辑器。在
  • Source Multiplayer Networking解释如何设计FPS类的半衰期。掌握减少延迟/延迟的技巧。在
  • Google Wave(显然文档还很差…)

相关问题 更多 >