前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从webrtc源码学习毫秒级计速器

从webrtc源码学习毫秒级计速器

原创
作者头像
morganji
发布2020-08-26 11:51:48
6050
发布2020-08-26 11:51:48
举报
文章被收录于专栏:多花点时间

在项目开发中,经常会需要一个计速器或限速器,尤其是网络方面,需要计算当前码率或者限制码率大小。在webrtc中就有很多网络策略值得借鉴,今天从webrtc源码中学习毫秒级计速器。

先看下一些RateStatistics成员变量:

Bucket中的samples表示采样次数,sum表示采样值总和。每一毫秒一个Bucket,创建“滑动窗口”,循环利用,大小为max_window_size。通过accumulated_count_、oldest_time_和scale_可计算出某一时刻的速率;oldest_time、oldest_index_和buckets_用户删除过时的记录。

接下来看下函数,主要就是三个Update,Rate,EraseOld。Update函数用于更新指定时刻的采样值:

首先删除过时的记录,因为buckets_是循环利用的,如果不删除过时的记录,新记录会在过时的老记录上进行叠加,这显然是不正确的。通过now_ms、oldest_time_和oldest_index_计算出存储位置index值,然后累加buckets_[index]和accumulated_count_等。

Rate函数获取指定时刻的速率:

首先还是删除过时的记录,不然计算出来不是最新窗口的速率,导致存在误差。接着是临界情况的判断,然后计算速率,上面代码用这个公式:rate = accumulated_count_ / active_window_size * scale_表达,可能更容易理解。这是个通用计速器,scale不同,可以演化出不同的计速器;以统计码率为例,那么Update函数以当前毫秒数和字节数为参数,而scale_应该等于8000。因为accumulated_count_ / active_window_size表示每毫秒传输的字节数,通过scale_转换为bps单位。

EraseOld函数删除过时的记录:

这里就是一个循环,对于过时记录,重新初始化bucket,更新accumulated_count_和num_samples_。循环条件里面增加num_samples_>0,可以提升一些效率。

整体逻辑比较简单,对外接口就是更新采样值,获取速率两个。注意点就是一些临界判断,比如什么时候才能获取可用的速率等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档