國際化司機端 機器良莠不齊,拉美司機端 機型都是很是低端,特別是巴西,拉取omega數據統計 內存2G及如下,佔比70%+,而澳洲司機端都是高端三星機器平均內存都是4G以上,於是咱們必須得"壓榨"咱們的代碼,吝嗇的分配cpu以及內存。java
介入卡頓優化以後,發現有個Top3的ANR以及一些相關卡頓程序員
【ANR】at com.sdu.didi.component.controlpanel.ControlPanelView$15.onAnimationUpdate(ControlPanelView.java:154) |
---|
在拉美一些配置通常的機型上容易出現,大可能是內存只有1G和2G的機型,根據omenga信息能夠定位到ANR是因爲首頁出車動畫在波紋屬性動畫刷新的時候會卡頓,卡頓嚴重了就ANR了,並且首頁出車動畫基本是一直在跑着的,確實影響用戶體驗。面試
看了下代碼架構
嗯,不卡纔怪呢,以前的同窗爲了實現這個無限循環的波紋動效,經過自定義一個圓點view,而後經過屬性動畫改變這個圓點的寬高、透明度,而後在動畫變化時requestLayout,這個效果是實現了,可是性能是極差的,屬性動畫這些操做都是主線程去執行的 在高端機型是可能性能hold住可是拉美的手機上有的直接就扛不住了,看來須要壓榨一下咱們的代碼了。app
Android中 View是經過刷新來重繪視圖,系統經過發出VSYNC
信號來進行屏幕的重繪,刷新的時間間隔是16ms
,若是咱們能夠在16ms之內將繪製工做完成,則沒有任何問題,若是咱們繪製過程邏輯很複雜,而且咱們的界面更新還很是頻繁,這時候就會形成界面的卡頓,影響用戶體驗,爲此Android提供了SurfaceView
來解決這一問題.ide
SurfaceView 繼承自View,是 Android 中一種比較特殊的視圖(View),性能
它跟普通View最大的區別是它有本身的Surface,在WMS中有對應的WindowState,在SurfaceFlinger中有Layer學習
通常的Activity包含的多個View會組成View hierachy的樹形結構,只有最頂層的DecorView,也就是根結點視圖,纔是對WMS可見的。這個DecorView在WMS中有一個對應的WindowState。相應地,在SF中對應的Layer。優化
綜合這些特色,SurfaceView 通常用在遊細、視頻、攝影等一些複雜 UI 且高效的圖像的顯示,這類的圖像處理都須要開單獨的線程來處理。它的優勢以下動畫
SurfaceView 經過子線程中進行畫面更新,View 則在主線程中進行畫面更新。
SurfaceView 用於被動更新,如頻繁畫面更新,View 則用於主動更新,如觸摸點擊等事件響應等。
下面清晰說明了SurfaceView的原理
若是當前畫面須要不停繪製或者數據處理量較大時,爲避免 UI 線程堵塞,就用 SurfaceView 代替 View。
SurfaceView擁有獨立的繪圖表面,即它不與其宿主窗口共享同一個繪圖表面,因爲擁有獨立的繪圖表面,所以SurfaceView的UI就能夠在一個獨立的線程中進行行繪製,因爲不佔用主線程資源,使得它能夠實現大多複雜而高效的界面繪製,如視頻播放 VideoView 和OpenGl es的 GLSurfaceView **直播軟件的 不停地點贊動效、天氣軟件的全屏雨雪動效、遊細中的流水、雲之類的變化等等。**
使用SurfaceView一頓操做以後
使用 HandlerThread + SurfaceView一頓操做後 (公司管得緊,項目代碼不許外放o(╥﹏╥)o)
咱們使用一臺小米2s(內存2G)來看下效果,
前置條件:小米2s 內存2G、只運行2個軟件(司機端、模擬定位軟件)、打開app後置於首頁出車頁面無其餘操做
能夠看出 基本在30%左右,一下子手機就開始發燙了
能夠看出從cpu消耗從 30%直降到 10%不到! 達到預期效果
一、在作業務的同時得保持技術的思考,不光能夠反哺業務,並且不會迷失在業務的汪揚大海中
二、須要"折騰",以改過爲能,不以無過爲貴,改的越多犯錯機率確實會高,可是咱們不是有阿波羅開關嘛
三、作國際化司機端coding得多一點點性能的考慮,國內的Android手機其實很好了,有時候並不會在乎一些性能開銷,這跟國際化業務是有點區別的
四、能落實到業務中的技術纔是好技術,否則可能會成爲"屠龍術"
最後對於程序員來講,要學習的知識內容、技術有太多太多,要想不被環境淘汰就只有不斷提高本身,歷來都是咱們去適應環境,而不是環境來適應咱們!
這裏附上上述的技術體系圖相關的幾十套騰訊、頭條、阿里、美團等公司19年的面試題,把技術點整理成了視頻和PDF(實際上比預期多花了很多精力),包含知識脈絡 + 諸多細節,因爲篇幅有限,這裏以圖片的形式給你們展現一部分。
相信它會給你們帶來不少收穫:
上述【高清技術腦圖】以及【配套的架構技術PDF】能夠 加我wx:X1524478394 免費獲取
當程序員容易,當一個優秀的程序員是須要不斷學習的,從初級程序員到高級程序員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每一個階段都須要掌握不一樣的能力。早早肯定本身的職業方向,才能在工做和能力提高中甩開同齡人。
你們的首頁啓動,有哪些優化呢?歡迎留言討論~