首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清除WebRTC数据通道队列

清除WebRTC数据通道队列
EN

Stack Overflow用户
提问于 2022-02-03 17:31:46
回答 2查看 454关注 0票数 0

我一直试图在游戏中使用WebRTC数据通道,但是,在50-70秒的播放之后,我无法持续地发送实时玩家数据而不达到队列大小限制(8KB)。

如果数据必须是实时的,那么我就没有必要使用不正常的数据。我已经用以下属性初始化了数据通道:

代码语言:javascript
复制
negotiated: true, 
id: id, 
ordered: true, 
maxRetransmits: 0, 
maxPacketLifetime: 66 

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

无论如何,我是否可以始终发送数据,而不超过缓冲区空间?我不介意清除缓冲区空间,因为它只包含随着时间推移而阻塞的数据。

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

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

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2022-02-11 12:12:00

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

正如肖恩所说,没有办法排成一排。如果信道拥塞,您可以做的是在发送数据包之前丢弃它们:

代码语言:javascript
复制
if(dc.bufferedAmount > 0)
     return;
dc.send(data);

最后,您应该认识到,缓存可能发生在网络中,也可能发生在发送方:任何路由器都可以在拥塞时缓冲数据包,而且许多路由器都有非常大的缓冲区(这称为BufferBloat)。WebRTC堆栈应该防止您缓冲网络中的太多数据,但是如果WebRTC的行为不够主动,您将需要向接收方添加来自发件人的显式反馈,以避免过多的数据包在传输中。

票数 1
EN

Stack Overflow用户

发布于 2022-02-03 21:07:35

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

如果需要的话,你可以自己处理重传并丢弃旧数据吗?WebRTC不对来自SCTP的包进行表面处理。所以我认为你需要自己去实现一些东西。

这是个有趣的问题。如果公开更多的信息会使事情变得更简单的话,那么WebRTC W3C WorkGroup会很乐意听它的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70975722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档