今天看到了PacedSender,然后又在其中看到了特殊的AlrDetector,而又在AlrDetector中看到了RateStatistics,于是在此笔记一下。
RateStatistics属于base模块,主要用于类似最近的max_window_size_ms大小的时间段内的网速,本来是很简单的一个数组能解决的功能,webrtc按照习惯写的比较复杂,但是封装的接口还是比较清晰,主要思路是,用window_size_ms大小的数组类似桶排序的方式摆放接收到的数据,以当前时间到最后过期时间差为下标存储数据,每次有新数据时,采用遍历的方法排除过期数据。没有一点桶排序查找效率高的优点,倒是有内存占用大的缺点。效率比较低下;
重要内部函数解析:
void RateStatistics::EraseOld(int64_t now_ms):删除过期的数据,即now_ms - current_window_size_ms_时间之外的数据。
重要接口函数解析:
RateStatistics(int64_t max_window_size_ms, float scale):构造函数,max_window_size_ms表示窗口大小,scale表示转换参数,影响最后结果,用于单位转换。
void RateStatistics::Update(size_t count, int64_t now_ms):新增count个数据到记录中,并调用EraseOld删除current_window_size_ms_之外的过期数据
rtc::Optional Rate(int64_t now_ms):获得当前的网速,等于count * scale / active_window_size,所以count单位与scale觉得最后单位。采用scale = kBpsScale(8000.0f)时,当count单位为Byte,Rate单位为kBps。