WebRTC 是正确的吗? (实时多人游戏)
Posted
技术标签:
【中文标题】WebRTC 是正确的吗? (实时多人游戏)【英文标题】:WebRTC the right one? (realtime multiplayer game) 【发布时间】:2012-10-03 00:45:37 【问题描述】:想象一下,我想用 html5(客户端)和 node.js(服务器)创建一个实时多人游戏。
我需要非常快速地将数据从服务器传输到客户端,反之亦然。
在本机应用程序中,我会使用 UDP
来获取最多的数据(玩家位置,...),因为它比 TCP
快得多,并且在丢失时它并不重要。
在HTML5
中,我可以(仅)使用WebSockets
。 WebSockets 位于 TCP 之上,因此速度不够快,无法获得良好的性能。
我听说过WebRTC
,但我不知道这是否可以解决这个问题。
有人用过吗?
(我知道,大多数浏览器仍然不支持 WebRTC,但这对我来说并不重要。)
【问题讨论】:
您确定 websocket 对您的用例来说太慢了吗? tcp 套接字在您的 websocket 会话期间保持打开状态,因此您不必担心每条消息的连接开销。 TCP:可靠的消息传递;所有数据都得到确认 所有数据的交付都得到管理,丢失的数据会自动重新传输。 UDP:不可靠、尽力而为的交付,没有确认因此 TCP 完全是这个用例的错误技术。 尝试使用 WebSockets 实现它并测量它是否真的太慢(不用说,抽象你的传输实现,这样如果 WebSockets 确实不令人满意,你可以使用其他东西而不报废很多代码)。现在你过早地优化了。 Firefox Nightlies 已经开始实现 WebRTC 数据通道:hacks.mozilla.org/2012/11/… 我想知道是否可以使用 Node.js 作为连接中的一个节点。 【参考方案1】:就 WebRTC 而言,听起来您需要的是 DataChannel:请参阅 draft protocol 和 HTML5 Rocks article(免责声明:我写的!)
DataChannel 正在进行中,尚未被任何浏览器实现。
至于其他 WebRTC 组件,Chrome、Firefox Nightlies 和 Opera 都支持 MediaStream (getUserMedia); RTCPeerConnection 在 Chrome 稳定版中,在标志后面(即将发布的版本中没有标志),并承诺在 2013 年第一季度用于 Firefox 18。
编辑:RTCDataChannel 现已在 Firefox 和 Chrome 上实现。
Chrome“单页”演示:simpl.info/dc、Firefox demo。
【讨论】:
关于最新发布的公告,我看到 MediaStream 和 PeerConnection 正在快速发展。 DataChannel 进展如何?您的文章还提到了用于浏览器到浏览器通信的 DataChannel。它也适用于浏览器到服务器,对吧? 感谢您指出这一点——有一段时间没看这个了:添加编辑。在服务器上,您可以使用 WebRTC C++ API。【参考方案2】:RTCDataChannel 提供基于会话/可靠以及无连接/不可靠的传输,分别类似于本机客户端中的 TCP 和 UDP。更多信息here。截至 2013 年,这是一项可行的技术,尽管仅在后来的 Chrome 和 Firefox 版本中才有。
According to html5rocks.com,现在也可以使用二进制类型进行传输。因此,您应该拥有高效的本机 UDP 客户端所具备的所有功能。 然而,我还不确定二进制传输是否已经从 webrtc 存储库 where it has been fixed 一直进入 Chrome,或者它是否仍仅在现阶段仅在 Chrome Canary 中可用。
【讨论】:
以上是关于WebRTC 是正确的吗? (实时多人游戏)的主要内容,如果未能解决你的问题,请参考以下文章