【问题标题】:Storing real time canvas session data on Node JS在 Node JS 上存储实时画布会话数据
【发布时间】: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


【解决方案1】:

这是我自以为是的答案。 最好的方法是让服务器通过数据库维护数据的副本。这意味着每当您的客户端启动时,他们将始终有数据可用于在新客户端启动时丢弃数据包的情况下,并且还能够维护旧数据。当我开发一个类似的概念时,我以游戏对象为例,并获得了许多客户的良好回报。即使有错误的设计理念,在本地网络上也没有明显的延迟。希望这会有所帮助

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 2014-02-10
    • 2017-10-07
    • 2018-12-05
    • 2014-07-10
    • 2013-01-19
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多