我有自己的绘图程序,有各种绘图工具,如钢笔、橡皮擦、矩形、圆形、选择、文本等
它是用Python和wxPython制作的。上面提到的每个工具都是一个类,它们都有多态方法,如left_down()、mouse_motion()、hit_test()等。程序管理一个所有绘制形状的列表,当用户绘制了一个形状时,它会被添加到列表中。这也用于管理撤消/重做操作。在
所以,我有一个不错的代码库,我可以把协作绘图挂到其中。每个形状都可以更改为知道其所有者(即绘制它的用户),并且只允许对一个人拥有的形状执行删除/移动/重缩放操作。在
我只是想知道最好的发展方式。一个人在“会话”中将不得不充当服务器,我没有钱提供免费的中央服务器。不知何故,用户需要一种连接到服务器的方式,这意味着某种“发现服务器”浏览器…或其他什么。如何广播对应用程序所做的更改?实时绘制并在每个鼠标移动事件上广播一条消息,在性能上会很昂贵,而且在给定的时间内,用户越多,情况就越糟糕。在
任何想法都是受欢迎的,我不太确定从哪里开始开发这个(或者如何测试它)
制作任何实时协作工具/游戏,归根结底都是在客户端之间以最小的共享数据结构高效地同步更改。网络带宽是瓶颈。只发送同步共享数据绝对需要的信息。通过存储形状而不是单个像素,您就走上了正确的轨道。但是,形状不应处理鼠标事件。正如您所指出的,广播鼠标事件将很快饱和网络带宽!相反,传递鼠标事件如何改变形状的增量。例如,不发送mouse_motion(),而是在移动形状后发送最终位置[x,y]。在
我建议将绘图程序分为服务器部分和客户端部分。服务器保留共享数据的权威版本。客户机从不直接操作共享数据结构;它只向服务器发送网络消息。当客户机和服务器都在同一个进程/PC中时,这可能看起来很愚蠢,但有一些很好的理由:
此外,编辑不必仅限于该形状的所有者。由于服务器是最终的权威,所以当两个人同时获取同一个形状并将结果发送回客户端时,它可以解决任何冲突。(不过,撤消有点棘手。)
虽然集中式服务器最适合网络发现,但客户端可以使用其他方法来查找服务器:
最后,看看其他多用户应用程序是如何设计的。以下是一些示例:
相关问题 更多 >
编程相关推荐