【发布时间】:2016-11-14 21:43:00
【问题描述】:
我正在使用 nodeJS + HTML5 画布和 websockets 编写一个实时绘图应用程序
当前服务器只是充当中继,每个用户绘制的内容都会广播给其余用户。
这里的问题是,当新用户出现时,他们从一个空白画布开始。
我对如何解决这个问题有两个想法,
1) 事件驱动的方法 - 这是我在内存中保留每个绘图事件的地方。以及当新用户出现在会话中时。所有事件都被重建并发送给他/她。
2) 服务器维护画布的副本。因此,服务器不仅转发绘图事件,还呈现所有绘图事件。当新用户出现时,这个状态就会传递给它。
任何人都对这两种方法的优缺点有任何想法,或者更好的解决方法!
【问题讨论】:
-
自己在做论文时遇到了这个问题。我使用了第二个选项并使用 redis 来存储画布数据,当用户加入时,通过套接字发送数据。这样每个新连接都会在屏幕上显示所有数据
-
@Dennington-bear 哇,很高兴知道我并不孤单。谢谢!它对您向用户交付的速度有任何影响吗?与仅转发相比?也想过用redis!
-
我只在我的大学本地网络上测试过它。但是我有大约 100 个客户端在运行,没有明显的主机延迟。大约 120-130 大关是我注意到滞后的时候。但即便如此,出于某种原因,我还是走上了将子进程与 node.js 一起使用的路线,这不是最好的方向。现在,如果我这样做,我会更多地关注集群。我觉得这会给你更多的性能,因为我可能会在任何地方留下阻碍性能的代价高昂的错误。 Redis 对我来说无疑是最好的选择,但对于您的用例,这可能会有所不同。
-
我使用 socket.io 发送了三个.js 对象并将它们从主机存储在 redis 中,然后将其发送给客户端。但根据您发送的数据,您可能还应该研究其他问题。我的案例是更多的游戏对象密集型,所以只有纯数据,没有图像或其他任何东西
-
@Dennington-bear 感谢您提供的信息。你的redis项目是开源的吗?哈哈,一些源代码真的对我有帮助!不管怎样,提交一个答案,然后我就把它作为答案:)
标签: javascript node.js html websocket html5-canvas