1. 背景
国际化司机端 机器参差不齐,拉美司机端 机型都是非常低端,特别是巴西,拉取omega数据统计 内存2G及以下,占比70%+,而澳洲司机端都是高端三星机器平均内存都是4G以上,因而我们必须得"压榨"我们的代码,吝啬的分配cpu以及内存。
2. 发现问题
介入卡顿优化之后,发现有个Top3的ANR以及一些相关卡顿
在拉美一些配置一般的机型上容易出现,大多是内存只有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 免费获取!
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
大家的首页启动,有哪些优化呢?欢迎留言讨论~
相关推荐
在运营数据方面,滴滴在2021年第一季度末统计的一年内,业务已经拓展到15个国家的近4000个城市与地区,全球年活跃用户数达到4.93亿,年活跃司机数达到1500万,日均交易次数达4100万次,全球GTV(Gross Transaction ...
滴滴的增长动力来自于其独特的双飞轮模型,即“共享出行需求提升→吸引司机进入行业→运力提升”以及“车服业务提高司机效率及降低运营成本→司机收益增长→更多司机加入,平台运力提升”。 滴滴出行的多元化扩张...
滴滴发展研究院:2021中国数字出行经济活跃度指数报告.pdf
《滴滴发展研究院:2021中国数字出行经济活跃度指数报告》是滴滴发展研究院发布的一份关于中国数字化出行领域的深度研究报告。这份报告全面揭示了2021年中国数字出行经济的发展状况、活跃度趋势以及对社会经济的影响...
滴滴司机端
这包括但不限于性能优化、减少启动时间、提高内存和CPU的使用效率、降低功耗等。 4. 持续集成与持续部署:组件化后,各个组件可以独立进行持续集成和持续部署(CI/CD),这可以加快开发周期,提高发布质量和效率。 ...
滴滴出行是中国领先的移动出行平台,以其便捷的打车服务、多元化的出行选择和广泛的市场覆盖,在国内互联网行业中占据着重要地位。这篇文档“传媒互联网:滴滴出行全梳理”深入剖析了滴滴出行的发展历程、业务模式、...
在移动应用开发中,滴滴打车的底部滑动条是一个常见的设计元素,它通常包含多个功能模块,如“首页”、“订单”、“消息”和“我的”,用户可以通过滑动或点击来切换不同的页面。这种设计既美观又实用,提高了用户的...
滴滴打车Java项目是一个基于Javaweb技术的模拟应用,旨在通过SSH(Spring、Struts2、Hibernate)三大框架的集成,实现类似滴滴出行的实际功能。SSH框架是Java领域中常用的MVC(模型-视图-控制器)架构模式的实现,...
11. **性能优化**:为了提供流畅的用户体验,滴滴打车会在内存管理、图片加载、网络请求等方面进行性能优化,减少资源消耗,提升应用启动速度和运行效率。 12. **测试与调试**:在整个开发过程中,单元测试、集成...
藏经阁-滴滴的组件化实践与优化 组件化实践 在滴滴的组件化实践中,组件化是指将应用程序分解成小的、独立的组件,每个组件都负责特定的业务逻辑。这种方法可以使得代码更加模块化、灵活和可维护。滴滴的组件化...
滴滴车主5.4.6的iphone,ipa安装包
截至2021年第一季度末,滴滴的业务覆盖了15个国家的近4000个城镇,拥有4.93亿年活跃用户和1500万年活跃司机,每日交易量高达4100万次,全球年交易总额(GTV)达到3410亿元。 中国的出行市场庞大,2020年市场规模为5...
当用户确认叫车后,滴滴会启动订单匹配算法,该算法会考虑距离、时间以及用户的个性化偏好(如车型、司机类型等),来寻找最合适、最符合用户需求的司机。对于拼车订单,系统还需要在众多可能性中找出最佳组合,同时...
### 滴滴出行中台构建详解 #### 一、滴滴出行简介与变革 滴滴出行作为全球共享出行领域的领军者,自2012年成立以来,通过不断的技术创新和服务优化,彻底改变了人们的出行方式。从最初的出租车服务扩展到如今涵盖...
滴滴车主6.1.12的iphone,ipa安装包
【小程序模仿滴滴打车】项目概述 小程序是一种轻量级的应用形态,无需安装即可使用,非常适合开发类似滴滴打车这样的出行服务应用。本项目旨在模仿滴滴打车的核心功能,为用户提供便捷的叫车体验。然而,需要注意的...