滴滴老司机开车:启动速度优化,30%直降到 10%不到!

1. 背景

国际化司机端 机器参差不齐,拉美司机端 机型都是非常低端,特别是巴西,拉取omega数据统计 内存2G及以下,占比70%+,而澳洲司机端都是高端三星机器平均内存都是4G以上,因而我们必须得"压榨"我们的代码,吝啬的分配cpu以及内存。

2. 发现问题

介入卡顿优化之后,发现有个Top3的ANR以及一些相关卡顿

【ANR】at com.sdu.didi.component.controlpanel.ControlPanelView$15.onAnimationUpdate(ControlPanelView.java:154)

在拉美一些配置一般的机型上容易出现,大多是内存只有1G和2G的机型,根据omenga信息可以定位到ANR是由于首页出车动画在波纹属性动画刷新的时候会卡顿,卡顿严重了就ANR了,而且首页出车动画基本是一直在跑着的,确实影响用户体验。

3. 分析问题

分析代码

看了下代码

嗯,不卡才怪呢,之前的同学为了实现这个无限循环的波纹动效,通过自定义一个圆点view,然后通过属性动画改变这个圆点的宽高、透明度,然后在动画变化时requestLayout,这个效果是实现了,但是性能是极差的,属性动画这些操作都是主线程去执行的 在高端机型是可能性能hold住但是拉美的手机上有的直接就扛不住了,看来需要压榨一下我们的代码了。

4. 解决问题

SurfaceView

Android中 View是通过刷新来重绘视图,系统通过发出VSYNC信号来进行屏幕的重绘,刷新的时间间隔是16ms,如果我们可以在16ms以内将绘制工作完成,则没有任何问题,如果我们绘制过程逻辑很复杂,并且我们的界面更新还非常频繁,这时候就会造成界面的卡顿,影响用户体验,为此Android提供了SurfaceView来解决这一问题.

SurfaceView 继承自View,是?Android?中一种比较特殊的视图(View),

  • 它跟普通View最大的区别是它有自己的Surface,在WMS中有对应的WindowState,在SurfaceFlinger中有Layer
  • 一般的Activity包含的多个View会组成View hierachy的树形结构,只有最顶层的DecorView,也就是根结点视图,才是对WMS可见的。这个DecorView在WMS中有一个对应的WindowState。相应地,在SF中对应的Layer
  • SurfaceView自带一个Surface,这个Surface在WMS中有自己对应的WindowState,在SF中也会有自己的Layer。虽然在App端它仍在View hierachy中,但在Server端(WMS和SF)中,它与宿主窗口是分离的。这样的好处是对这个Surface的渲染可以放到单独线程去做,渲染时可以有自己的GL context。这对于一些游细、视频等性能相关的应用非常有益,因为它不会影响主线程对事件的响应。

综合这些特点,SurfaceView 一般用在游细、视频、摄影等一些复杂 UI 且高效的图像的显示,这类的图像处理都需要开单独的线程来处理。它的优点如下

  • SurfaceView 通过子线程中进行画面更新,View 则在主线程中进行画面更新。
  • SurfaceView 用于被动更新,如频繁画面更新,View 则用于主动更新,如触摸点击等事件响应等。
  • SurfaceView 在底层实现了双缓冲机制,效率大大提升了,View 则没有。

下面清晰说明了SurfaceView的原理

如果当前画面需要不停绘制或者数据处理量较大时,为避免 UI 线程堵塞,就用 SurfaceView 代替 View。

SurfaceView拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面,由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行行绘制,由于不占用主线程资源,使得它可以实现大多复杂而高效的界面绘制,如视频播放?VideoView?和OpenGl es的?GLSurfaceView?**直播软件的 不停地点赞动效、天气软件的全屏雨雪动效、游细中的流水、云之类的变化等等。**

使用SurfaceView一顿操作之后?
使用 HandlerThread +?SurfaceView一顿操作后?(公司管得紧,项目代码不准外放o(╥﹏╥)o)

我们使用一台小米2s(内存2G)来看下效果,

5. 效果

前置条件:小米2s 内存2G、只运行2个软件(司机端、模拟定位软件)、打开app后置于首页出车页面无其他操作

优化前首页cpu消耗

可以看出 基本在30%左右,一会儿手机就开始发烫了

使用surfaceview优化后cpu消耗

可以看出从cpu消耗从?30%直降到 10%不到! 达到预期效果

6. 一些思考

1、在做业务的同时得保持技术的思考,不光可以反哺业务,而且不会迷失在业务的汪扬大海中
2、需要"折腾",以改过为能,不以无过为贵,改的越多犯错概率确实会高,但是我们不是有阿波罗开关嘛
3、做国际化司机端coding得多一点点性能的考虑,国内的Android手机其实很好了,有时候并不会在意一些性能开销,这跟国际化业务是有点区别的
4、能落实到业务中的技术才是好技术,不然可能会成为"屠龙术"



最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

上述【高清技术脑图】以及【配套的架构技术PDF】可以 加我wx:X1524478394 免费获取

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

大家的首页启动,有哪些优化呢?欢迎留言讨论~

原文地址:https://blog.51cto.com/14332859/2458189

时间: 2024-07-30 20:25:07

滴滴老司机开车:启动速度优化,30%直降到 10%不到!的相关文章

应用程序启动速度优化

Mac OS/Android下的Static Initializer Mozilla工程师通过优化Static Initializer(静态初始化,或全局建构函数, Global Constructor)和Binary布局来提升FireFox启动速度的文章,非常有参考价值.文章中以x86及x86-64平台为基础,下面加了Mac OS及Android上的binary布局. 什么是Static Initializer? 简而言之就是全局C++对象的初始化.有人笑称一个C++程序的main()函数执行

爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结

本文由爱奇艺技术团队原创分享,原题<爱奇艺Android客户端启动优化与分析>. 1.引言 互联网领域里有个八秒定律,如果网页打开时间超过8秒,便会有超过70%的用户放弃等待,对Android APP而言,要求更加严格,如果系统无响应时间超过5秒,便会出现ANR,APP可能会被强制关闭,因此,启动时间作为一个重要的性能指标,关系着用户的第一体验. 爱奇艺安卓APP非常重视启动速度的优化,本文将从启动过程.启动时间测量.启动优化.以及后续监控等方面分享我们在启动优化方面积累的经验. 相关文章:

经典PC大作Steam直降200元:罕见史低!

6月14日,Steam平台的<黑暗之魂>系列游戏特惠促销,玩家最低可以以39元的价格开启受苦之旅.<黑暗之魂>系列Steam开启特惠促销:最低2.5折 首先是<黑暗之魂1重制版>,玩家可享-30%优惠,原价198元,现在仅需138元,如果玩家拥有<黑暗之魂1受死版>,最低可以以39元的价格入手,138元也是<黑暗之魂1重制版>的历史最低价. 至于<黑暗之魂2原罪学者>,玩家可享-75%优惠,原价158元,现价仅需39元,这个价格无需多

Android内核开发:系统启动速度优化

在学习新知识的过程中,我一直很推荐结合实战任务去学习,只有经历实战,才能加深对理论知识的理解.<Android内核开发>系列已经写了八篇了,本文就结合前面的内容,给大家布置一个实战任务: 优化Android系统的启动速度. 这里我简单介绍一下优化的基本思路和涉及的文件,具体细节由大家自己在实践去摸索,提高自己Google能力和解决问题的能力. Android系统的启动优化主要分为三大部分: (1) Bootloader优化 (2) Linux Kernel的剪裁与优化 (3) Android

网站优化(SEO)的10大误区

前段时间大前端也有关于SEO的文章贡献给广大读者,今日,再发一文,网站优化(SEO)的10大误区.很多新手站长初次接触SEO,感受到SEO 的无穷魅力,想要做一位优秀的SEOer,然而新手朋友在进行SEO时难免会因为经验的缺乏做出一些错误 的做法,这里大前端就为您指出一些SEO中常见的新手易犯的错误之处,以供参考. 误区一:外链群发. 新手SEOer朋友往往对SEO了解不够全面,听说网站外链多了排名和权重就会上去,就搞一些论坛或者博客群发软件开始 群发外链,结果相当凄惨,网站轻则被降权,排名跌到

10.28 rsync工具介绍 - 10.29/10.30 rsync常用选项 - 10.31 rsync通过ssh同步

- 10.28 rsync工具介绍 - 10.29/10.30 rsync常用选项 - 10.31 rsync通过ssh同步 # 10.28 rsync工具介绍 -/A目录 --> /B目录(A目录更新了一个文件,每次更新都需要把A目录拷贝到B目录),如果用cp命令 比较浪费时间,耗费磁盘空间,磁盘压力 读写之类的, -使用rsync -av /etc/passwd /tmp/1.txt -a选项就是包含了好几个选项  ,v 是可视化,可以看到拷贝的过程 ``` [[email protecte

考考你、智商题 小明借爸爸500元 又借妈妈500元 买双鞋 970元 还剩30元 还给爸爸10元

考考你.智商题小明借爸爸500元又借妈妈500元买双鞋 970元还剩30元还给爸爸10元又还妈妈10元 自己留10元欠妈妈490 欠爸爸490490+490=980 加上自己的10元=990请问那10元去哪了 解答:还了10元,实际借款就不是500了,是490元.总借款现在已经不是1000元,而是980元.买鞋970元,还剩下10元.

八周二次课(1月30日) 10.28 rsync工具介绍 10.29/10.30 rsync常用选项 10.31 rsync通过ssh同步

八周二次课(1月30日)10.28 rsync工具介绍10.29/10.30 rsync常用选项10.31 rsync通过ssh同步===================================================================================================================================================================rsync命令:是一个远程数据同步工具,可

10.28 rsync工具介绍 10.29/10.30 rsync常用选项 10.31 rsync通

八周二次课 10.28 rsync工具介绍 10.29/10.30 rsync常用选项 10.31 rsync通过ssh同步 10.28 rsync工具介绍 10.29/10.30 rsync常用选项 设置rsync Rsync 进行同步 删除多余文件 排除掉*.txt的文件 参数:-P 参数:-u 10.31 rsync通过ssh同步 原文地址:http://blog.51cto.com/wbyyy/2067136