0

我一直在尝试将 WebRTC 数据通道用于游戏,但是,在玩 50-70 秒后,我无法在不达到队列大小限制 (8KB) 的情况下持续发送实时玩家数据。

因为数据需要是实时的,我对乱序的数据没有用处。我已经使用以下属性初始化了数据通道:

negotiated: true, 
id: id, 
ordered: true, 
maxRetransmits: 0, 
maxPacketLifetime: 66 

MDN 文档说缓冲区不能以任何方式更改。

无论如何我可以在不超过缓冲区空间的情况下持续发送数据吗?我不介意清除缓冲区空间,因为它只包含随时间阻塞的数据。

注意:数据一直在传输,直到缓冲区大小超过 8KB 空间。

编辑:我忘了补充一点,这个问题只有在双方位于不同的网络上时才会发生。当两者都在同一个局域网内时,没有缓冲(我想是因为带宽更高)。我尝试添加多个数据通道(8 个并行)。然而,这只增加了故障再次发生之前的时间。所有 8 个缓冲区都已满。我还尝试在每次缓冲区接近满时创建一个新通道,并在关闭前一个已满的 DC 时切换到新的 DC,但我发现缓冲区空间是困难的方式(阅读MDN Docs中的注释)不会立即释放,而是尝试传输缓冲区中的所有数据,从而占用宝贵的带宽。

提前致谢。

4

2 回答 2

1

maxRetransmits如果设置了值,则忽略该值maxPacketLifetime;因此,您已将通道配置为重新发送数据包最多 66 毫秒。对于您的应用程序,最好通过设置maxPacketLifetime为 0 来使用纯不可靠通道。

正如肖恩所说,没有办法刷新队列。如果通道拥塞,您可以做的是在发送数据包之前丢弃数据包:

if(dc.bufferedAmount > 0)
     return;
dc.send(data);

最后,您应该意识到缓冲可能发生在网络中以及发送方:任何路由器都可以在拥塞时缓冲数据包,并且许多路由器具有非常大的缓冲区(这称为BufferBloat)。WebRTC 堆栈应该防止您在网络中缓冲过多的数据,但如果 WebRTC 的行为不足以满足您的需求,您将需要添加从发送方到接收方的显式反馈,以避免传输中的数据包过多.

于 2022-02-11T12:12:00.967 回答
0

我不相信您可以刷新出站缓冲区,您可能需要观察 bufferedAmount 并在它增长时调整您发送的内容。

也许自己处理重传并在需要时丢弃旧数据?WebRTC 不会显示来自 SCTP 的 SACK。所以我认为你需要自己实现一些东西。

这是一个有趣的问题。如果公开更多信息会让您的事情变得更容易,我很乐意听到 WebRTC W3C 工作组接受它。

于 2022-02-03T21:07:35.733 回答