Linwei
Linwei
天底下就没几个协议支持组播,并非没有原因,即便让你看起来好像是组播,也需要分开维护每个远端的状态,这和 多创建几个 kcp 对象有啥区别?你自己直接多创建几个 kcp 对象会掉两斤肉么?
自己设计吧,你可以每个客户端用 kcp 和服务端连接,平时公共视频数据,你用独立 udp 组播,然后各个客户端发现有缺失了,再用 kcp 向服务器请求重发,服务器再用 kcp 单独发给各个客户端他们缺失的部分;并且客户端要做限制,超过一定时间重发没回来就直接丢帧吧。
他都组播了,哪里来的码率自适应。
废话,你服务端重启了,原有 tcp 连接还能接着用么?
你别搞笑了,UDP 没状态,KCP 是有状态的啊;就像 IP 没状态,TCP 是有状态的啊;TCP 怎么处理 KCP 就怎么处理;服务器都重启了,你凭啥想指望旧的客户端 KCP 对象还可以同新的服务端 KCP 对象通信?有点基础知识行不行,两边全部重建新的 KCP 对象再连接;
心跳不是 kcp 的事情,请自己在连接层增加 UDP 心跳,自己判断断线。
加锁当然可以,但是最好不要,一个状态机完全由一个线程才是正道
KCP 开了 nodelay 没有?关掉流控没有?设置 interval 没有?处理包积累没有?
试试:ikcp_nodelay(kcp_instance, 2, 1, 1, 1); 然后:kcp_instance 对象的 snd_wnd 和 rcv_wnd 设置成 1024, 先确定以下,把发送端的每秒打印 ikcp_waitsnd() 的结果,看看是不是在持续变大。 再确认下,接收端每次开始接收时是 while 循环调用 ikcp_recv 直到没数据才 break,进入 sleep?
最好不要多线程同时操作一个 kcp 对象,操作也要加锁。另外注意,数据在各个环节是否能够即时投递。