反射模块理解

来源:互联网 发布:龙猫 知乎 编辑:程序博客网 时间:2024/06/04 00:44
1.缓冲区时间(reflector_buffer_size_sec):存储一定时间的数据包
2.sBucketSize 每一组水桶的个数,默认16:代表直播客户端的输出被一组一组地管理成二维形式,表示每一组的大小
3.fNumBuckets 多少组水桶 默认16组
4.每一组的缓冲区偏移时间 单位 (sBucketDelayInMsec,默认73ms):第一组0ms,第二组:73*1ms 第三组:73*2ms
5.bucketDelay: 这个延迟时间是这样管理的:代表直播客户端的输出被一组一组地管理成二维形式,而不是线性的一维形式。
  根据这个二维形式,一个组对应一个延迟时间,越在后面的组,延迟的时间越长。
  最终会遍历整个水桶集,每一组水桶的延迟时间都不一样。SInt64  bucketDelay = ReflectorStream::sBucketDelayInMsec * (SInt64)bucketIndex;
6.sFirstPacketOffsetMsec:新的客户端的第一帧从哪里开始接收。表示在缓冲区中的偏移量,比如缓冲区为1000ms,偏移量sFirstPacketOffsetMsec为200ms,则首帧将从<=1000-200的位置开始接受。
7.sMaxPacketAgeMSec:每一个包能活的最长时间,如果超过这个时间,就会被删除掉,默认是10s钟。
8.thePacket->fTimeArrived:包的到达时间,服务器收到此包的时间。用当前时间减去thePacket->fTimeArrived就表示活了多少时间。
9.thePacket.packetTransmitTime:是包的实际发送时间,其生成规则为:(到达时间+总缓冲时间)-延迟时间(*arrivalTimeMSecPtr + fBufferDelayMSecs - packetLatenessInMSec)




10.书签
theOutput->GetBookMarkedPacket(&fPacketQueue); ReflectorOutput类的成员,针对每一个发送客户端都维护了一个。标定上次发送的位置(发送缓冲区fPacketQueue队列中的位置),本次接着这个位置继续发送。
packetElem = this->SendPacketsToOutput(theOutput, packetElem,currentTime, bucketDelay);//尽可能的将fPacketQueue中所有的数据都发送出去
(void) theOutput->SetBookMarkPacket(packetElem); // 记住本次发送的位置,以便下次发送时从该位置发送


10.ReflectorSender的缓冲区机制
ReflectorSocket在收到数据后,首先会从inFreeQueue申请一个包的空间,如果没有,则new一个包然后存放到fPacketQueue中。
当该包发送给了客户端之后(不再使用并且已经超过了sMaxPacketAgeMSec时间)则会被删除,然后再次放到inFreeQueue中,这样就可以循环利用,避免频繁分配释放内存,只有当ReflectorSender不在使用后,才会将整个内存收回 
发送缓冲区:fPacketQueue
空闲缓冲区:inFreeQueue
        if ( !thePacket->fNeededByOutput && packetDelay > currentMaxPacketDelay) // delete based on late tolerance and whether a client is blocked on the packet
 
       {  
          // not needed and older than our required buffer
       
          thePacket->Reset();
        
          fPacketQueue.Remove( elem );
   
          inFreeQueue->EnQueue( elem );
 
       }
0 0
原创粉丝点击