滴滴老司機開車:啓動速度優化,30%直降到 10%不到!

滴滴老司機開車:啓動速度優化,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. 分析問題

分析代碼

滴滴老司機開車:啓動速度優化,30%直降到 10%不到!

看了下代碼

滴滴老司機開車:啓動速度優化,30%直降到 10%不到!

滴滴老司機開車:啓動速度優化,30%直降到 10%不到!

嗯,不卡纔怪呢,之前的同學爲了實現這個無限循環的波紋動效,通過自定義一個圓點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的原理

滴滴老司機開車:啓動速度優化,30%直降到 10%不到!

如果當前畫面需要不停繪製或者數據處理量較大時,爲避免 UI 線程堵塞,就用 SurfaceView 代替 View。

SurfaceView擁有獨立的繪圖表面,即它不與其宿主窗口共享同一個繪圖表面,由於擁有獨立的繪圖表面,因此SurfaceView的UI就可以在一個獨立的線程中進行行繪製,由於不佔用主線程資源,使得它可以實現大多複雜而高效的界面繪製,如視頻播放 VideoView 和OpenGl es的 GLSurfaceView **直播軟件的 不停地點贊動效、天氣軟件的全屏雨雪動效、遊細中的流水、雲之類的變化等等。**

使用SurfaceView一頓操作之後 
使用 HandlerThread + SurfaceView一頓操作後 (公司管得緊,項目代碼不準外放o(╥﹏╥)o)

我們使用一臺小米2s(內存2G)來看下效果,

5. 效果

前置條件:小米2s 內存2G、只運行2個軟件(司機端、模擬定位軟件)、打開app後置於首頁出車頁面無其他操作

優化前首頁cpu消耗

滴滴老司機開車:啓動速度優化,30%直降到 10%不到!

可以看出 基本在30%左右,一會兒手機就開始發燙了

使用surfaceview優化後cpu消耗

滴滴老司機開車:啓動速度優化,30%直降到 10%不到!

可以看出從cpu消耗從 30%直降到 10%不到! 達到預期效果

滴滴老司機開車:啓動速度優化,30%直降到 10%不到!

6. 一些思考

1、在做業務的同時得保持技術的思考,不光可以反哺業務,而且不會迷失在業務的汪揚大海中
2、需要"折騰",以改過爲能,不以無過爲貴,改的越多犯錯概率確實會高,但是我們不是有阿波羅開關嘛
3、做國際化司機端coding得多一點點性能的考慮,國內的Android手機其實很好了,有時候並不會在意一些性能開銷,這跟國際化業務是有點區別的
4、能落實到業務中的技術纔是好技術,不然可能會成爲"屠龍術"


最後對於程序員來說,要學習的知識內容、技術有太多太多,要想不被環境淘汰就只有不斷提升自己,從來都是我們去適應環境,而不是環境來適應我們!

這裏附上上述的技術體系圖相關的幾十套騰訊、頭條、阿里、美團等公司19年的面試題,把技術點整理成了視頻和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由於篇幅有限,這裏以圖片的形式給大家展示一部分。

相信它會給大家帶來很多收穫:

滴滴老司機開車:啓動速度優化,30%直降到 10%不到!

上述【高清技術腦圖】以及【配套的架構技術PDF】可以 加我wx:X1524478394 免費獲取

當程序員容易,當一個優秀的程序員是需要不斷學習的,從初級程序員到高級程序員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每個階段都需要掌握不同的能力。早早確定自己的職業方向,才能在工作和能力提升中甩開同齡人。

大家的首頁啓動,有哪些優化呢?歡迎留言討論~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章