本文地址:https://blog.csdn.net/MagicFMan/article/details/127831260 严禁转载,后果自负
背景
最近一直在看压缩算法方面,没能找到一个研究性的方向,在研究的同时,有产生一个想法,想讨论下该想法涉及的方案的可行性,同时也希望通过该方案,打开算法研究的一个突破口,进一步在算法上对我们产品进行更深层次的优化。
原理
当前我们研究算法的一个主要目的之一是降低带宽峰值,我们已经研究过各种开源的压缩算法来使得图片编码后变得更小,如jpeg2000、webp、mozjpeg等,他们可以使的图片编码后相对于jpeg-turbo小20%-50%,但是这些算法耗时是jpeg-turbo的20倍以上,因为耗时过大而无法被采用,所以在降低数据发送量的方式上我们遇到了瓶颈。
现在我想不通过降低发送的量,而是将发送的量进行时间区域分布,达到降低某一时刻带宽的峰值,如下图所示,通过模式1或者模式2或者其他的分配模式降低峰值。
场景有益性
- 数据较大,而且还处于流控检测阶段,数据分次下发,降低带宽峰值;
- 控制峰值,根据带宽情况,通过配置文件,控制峰值、清晰度。(需要调研算法)
- 通过渐进从模糊到清晰,相对当前流控的直接在一瞬间从模糊到清晰,更为人眼所接受。
对算法的需求
希望通过研究找到一种算法,让图片可以进行渐进分包:
- 在一段时间内分次发送这些分包,达到图片在一段时间内从模糊到清晰;
- 算法分包耗时不能过大,否则造成卡顿问题;
- 渐进分包后包的总量相对现有压缩算法压缩不能超出太多,否则会直接影响到平均带宽。
与动态模糊的吻合
采用渐进发送方式,能做到动态模糊。为了不影响Spiceserver的取指周期,我们需要将渐进发送设置成一个单独的线程。所以在取指完之后,进行图片发送时上一张图片可能没有发送完,例如有可能只发送到60%的清晰,如果该张图片有覆盖上一张图片,那么上一张图片剩下清晰度的数据可以不用再发送了,也就是动态的时候图片没有达到完全清晰,如下图时序图。
与块缓存的结合
当前在大多数场景我们都采用块缓存的方式,所以同快缓存是否能有效结合也是判断案可行性的条件之一。其实分块发送对该方案来说也是有好处的,因为图片被划分成若干小块,所以可以大幅降低图片被局部覆盖的情况。
对于块缓存来说,按照原来的处理逻辑,如果块命中了,可能客户端存储的不是完全清晰的图片,如发送到80%清晰就被覆盖了,所以需要在块缓存数据结构上增加一个标志,判断客户端存储的是多少清晰度的图片,如果还没达到完全清晰就要发送剩余部分,使得图片达到清晰,具体流程如下:
问题与困难
当前方案只是一个粗略的想法,有很多未确定性的因素有待验证。
(1) 压缩算法为重中之重,需要在耗时、压缩率、渐进支持都能满足要求;
(2) 渐进分包发送对平均带宽的影响,不能增加或者不能增加过多;
(3) 渐进时间区域设置,达到多少能被人眼所接受,而此时对降峰值是否有作用。
(4) 其他,讨论出的问题和困难。