-
Init:初始化图片解码器,并将相应的数据结构透传到UC
-
Decode:UC会透传相应的数据到解码器,解码器解码完成后将相应的RGBA数据给到UC,UC最终将解码后的数据给到渲染层
-
Close:回收初始化过程中创建的系统资源
之前从事过PC开发的同学可能会熟悉这这种做法,PC插件化大多是利用dll(可以理解为Linux下的so)来实现,这在PC时代是常用做法,Python调用C++/C代码也可以通过封装为so进行调用。针对UC提供的这种能力,图片库对原有的HEIC解码器做了封装,实现了上面的接口规范,提供给UC调用,这样H5解码HEIC的问题就解决掉了。
真的这么顺利么?答案是No。手淘目前对so集成时的大小有限制,刚好HEIC的32位和64位so加起来将近4.5MB,这已经是严重超标了,是不可以接受的。
那该如何解决呢?架构组提供了远程加载so组件(上图中的远程下载),可以将so放在远程,不需要打进apk包,当需要的时候从远程下载,同时HEIC解码so是独立的没有依赖,直接dlopen打开就可以使用。这样我们的解码功能就顺利完成了,剩下的工作就需要Windvane同学添加相应的降级逻辑和监控逻辑提供必要的稳定性保障,到这里这个H5支持HEIC功能就完成了。
说了这么多从native支持HEIC到H5支持HEIC,收益是什么呢?有两个方面,一个是端上的收益,一个是服务端收益:
客户端
目前端上的计算能力已不是瓶颈,主要是网络的通信时间,图片体积越小,网络耗时越少,同时网络耗时的减少可以抵消端上解码耗时的增加,总体而言图片的加载性能会提高。同理对于H5页面也一样,网络耗时越少,页面性能也会有所提高。
服务端
对于服务端而言,图片的体积更小,占用的带宽也更小,单位时间内处理的请求增加,简单来说就是提高了QPS。
H5支持HEIC这个功能已经灰度了几个版本,后续会逐步全量,对于H5页而而言,页面性能也会得到提升。
我们可以先参考下native页面下HEIC图片和WEBP图片的下载时间和解码时间的对比数据:
Format | 网络时间(ms) | 解码时间(msHE) |
HEIC | 141 | 27.5 |
WEBP | 645 | 30 |
数据说明:样本数在几十万级别,基本可以抹平图片尺寸带来的统计差异。
从上面的数据也可以表明,网络时间的优化可以抵消部分解码时间的增加,有的同学看到数据会有疑问,解码时间并没有增加反而有所优化,这主要是多媒体算法团队对HEIC解码做了优化,同时图片空间空间同学对HEIC的封装做了优化(优化的后的封装,仍然是符合HEIF文件标准的)。
图片库缓存标准化
▐ 图片库磁盘缓存标准化
用过Phenix图片库或者三方开源图片库的同学都知道,图片库会有三层缓存(内存、磁盘、网络),磁盘缓存一般是持久化的,除非超过磁盘缓存大小被LRU淘汰掉,为了满足图片空间的需求,图片库对磁盘缓存做了改造。大体流程如下:
简单来说图片库的磁盘缓存可以指定过期时间,过期后图片请求会打到后端。图片空间会在图片响应头里添加过期字段来控制本次请求到的图片在磁盘缓存中存在的时长。目前实现的缓存控制是在原先LRU基础上实现的,即首先会判断这张图片有没有被LRU淘汰掉,如果没有被淘汰掉会走到缓存控制逻辑,如果已经被LRU淘汰,保持原有逻辑。
有同学可能会疑惑这么做有什么意义的呢?之前LRU策略图片更新时间是不确定的,有可能很快就过期了也有可能要等几十小时才能过期,完全取决于用户访问的频次以及用户的操作习惯,过期时间字段可以精确到小时级别,让图片及时过期,请求到最新的图片。
▐ URL不变更新图片
看到这个标题很多同学可能会有疑惑,URL不变更新图片是什么意思?简单来说就是访问相同的图片url图片的内容可能不同,经过这么一解释有的同学可能更加疑惑,为什么要这么做?
带着这个疑问我们来解释为什么会有这样的功能,促销对手淘来说比较常见,商家也会抓住这个机会尽可能吸引消费者去下单,提高成交量。图片作为手淘商品的主要信息载体,有活动的时候商家为了能够传递更多的信息给消费者,商家会频繁修改商品主图的促销样式和信息来吸引消费者去点击,更多的点击意味这更高的流量,从而带来更高的成交量。商家通过图片空间修改商品主图,图片空间会将修改后的主图URL更新到商品服务,但是这给商品服务带来了挑战,手淘承载着成千上万商家,如果促销期间大量商家去更新商品主图URL,对商品服务带来的压力不可小觑(不止主图更新会调用商品服务,其他业务也会去调用),因此在大促期间为了保证商品服务的稳定性,会进行必要的限流。大体流程如下图:
这样商家在特定的时间是不能及时修改商品图的,这会导商家和消费者的体验下降,因为主图的促销信息不能及时更新,导致主图显示的优惠信息和实际购买的优惠信息有可能会有偏差。这该如何解决呢?活动期间商家改图后商品主图URL不变,图片空间会将修改的图片更新到CDN,不再去频繁刷商品服务,商品服务的压力也会减小,消费者的体验也得到了保障。修改后的流程如下图:
有同学可能会有疑问,为什么不是提升商品服务的性能呢?以下是我简单的分析,不一定准确:数据库的写性能是有限的,无论再怎么优化再怎么加机器,大量的并发过来总会达到瓶颈。有的同学可能会说,分布式、分库、一致性哈希,或许可以做也可以解决问题,可是大促是短期行为,做这么大的改造耗费大量的人力成本,但是对非大促,这样的改造没有收益,同时也会增加系统的复杂度。
通过这样小成本的改造,将一部分流量转移到CDN侧,减轻了商品服务的压力同时也能提升商家和消费者的体验,商家也可以随时更新商品主图。
说了这么多图片库做了什么?一开始介绍的图片库磁盘缓存标准化,大促期间图片空间会在下发图片的Response中带上过期时间字段,设置一个合理的过期时间,便于大促期间商品主图的磁盘缓存隔一段时间过期一次,过期后请求新的图片,这样用户看到的图片始终是最新的,虽做不到实时但也可以达到小时级,能够满足业务的诉求。
总结
今年图片库的主要改动有两个方面:H5支持HEIC化以及图片库磁盘缓存标准化,这两个改造从本质上来说是将服务端的优化通过端上整合触达到用户。HEIC图片native端在2018年就已经开始支持,但是由于H5容器UC内核当时没有HEIC解码能力,所以H5页面没有使用HEIC,今年随着UC对外提供了三方解码插件的功能,利用这个契机将H5页面进行HEIC化。图片库磁盘缓存标准化。
✿ 拓展阅读
**作者|**房伟(云移)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
学习分享,共勉
这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!
资料整理不易,读者朋友可以转发分享下!
Java核心知识体系笔记.pdf
中高级Java开发面试高频考点题笔记300道.pdf
架构进阶面试专题及架构学习笔记脑图
Java架构进阶学习视频分享
[外链图片转存中…(img-9tio4mCX-1712031130054)]
中高级Java开发面试高频考点题笔记300道.pdf
[外链图片转存中…(img-GM5xOz3E-1712031130054)]
架构进阶面试专题及架构学习笔记脑图
[外链图片转存中…(img-YwTN8sKe-1712031130055)]
Java架构进阶学习视频分享