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