tmallfe / tmallfe.github.io

天猫前端
http://tmallfe.github.io
3.93k stars 508 forks source link

天猫双11前端分享系列(五):解密2015狂欢城 #29

Open maisui99 opened 8 years ago

maisui99 commented 8 years ago

截图

性能

Canvas Cache

Canvas Cache就是使用一个额外的Canvas来保存已经绘制过的内容,下一次使用的时候直接从这个Canvas上读取,这样就可以大大减少Canvas的绘制次数,例如原先首屏绘制次数约为75左右,使用cache后的次数约为28,减少了62.67%,在三四环会更明显,因为没有动画,所有内容都可以cache。

实测设备越低端性能提升越明显,下面是一个页面在不同平台下的消耗时间对比:

设备 不使用cache 使用cache 比值
PC 16ms 14ms 87.5%
Moto X 75ms 56ms 74.67%
Moto G 246ms 127ms 51.62%
iPhone5 170ms 45ms 26.47%

从结果看效果还是很明显的,而且这个只是缓存了6次绘制的结果,实际使用中会缓存个数约为50左右,效果会更明显。

一开始使用一个Canvas直接缓存所有内容,后来发现Canvas大小是有限制的,然后就实现了一个自动切片成多个Canvas Cache的方案,这套cache方案后面会集成到Hilo中。

Hilo 定制优化

针对Canvas的最主要优化方案就是尽量减少Canvas API的调用,在对狂欢城做了大量profile后,发现Hilo中每次drawImage都会调用ctx.save();ctx.translate(x, y);ctx.drawImage(...);ctx.restore();,这里Hilo主要是为了保证在所有情况(例如缩放,旋转等)下均不出错,所以才这样处理,但是再狂欢城中并不需要做旋转等复杂的变换,所以将这里的绘制直接改为使用ctx.drawImage来实现。这样可以节省大量运行时间,因为在狂欢城基本上全是图片!

实测性能提升非常明显,下面是消耗时间对比:

设备 优化前 优化后 比值
PC 30ms 15ms 50%
Moto X 138ms 76ms 55.07%
Moto G 435ms 216ms 49.66%
iPhone5 225ms 152ms 67.56%

视窗内渲染,懒加载及加载限流

在低端设备上使用1倍图片,减少内存占用,并且不显示动画。

开发效率

如果你看了这篇文章,对加入天猫前端团队有意向的,可以发简历到join-tmallfe@list.alibaba-inc.com,招聘要求见:https://job.alibaba.com/zhaopin/position_detail.htm?positionId=3504