1. 程式人生 > >面試記錄第十六節——(UI卡頓的問題)

面試記錄第十六節——(UI卡頓的問題)

一、60fps 和 16ms的含義

很多時候使用者感覺UI卡頓,而造成這種卡頓的最主要根源是來源於渲染器,我們在開發過程中,大家再和UI溝通的時候就可以感覺到。一般我們在和UI工程師溝通的時候,他們總想把APP做的很絢麗、功能很豐富、圖片很大很清晰,提高使用者的體驗效果。但是UI工程師是站在他們自己的角度考慮問題,他們並不知道,安卓系統很可能無法完成某些複雜的渲染操作。我們知道Android的系統每隔16毫秒傳送一次訊號,觸發對UI進行渲染,如果每一次都渲染成功,這樣就達到流程的畫面所需要的60fps(每秒60幀)。為了能實現60fps,這就標誌著,程式的大多數操作都必須在16ms內完成,也就是用1000/60 = 16毫秒。

有時候我們在執行某些動畫或者listview滑動的時候,我們會感覺到UI卡頓現象,動畫或者listview滑動不是那麼的順暢,這就是操作過於複雜,產生了丟幀現象,最終導致卡頓。其實有很多方面都會造成UI卡頓,例如listview的item的layout太過複雜,他就無法完成在16秒內的渲染,也有可能你的item層疊了太多background或者動畫執行的次數過多,這些都會造成CPU和GPU的負載過重。

二、為什麼要把標準設定在60fps

答:

第一種:我們都知道,人腦對於畫面的連貫性,它是由一定的限制的,對於手機來說,我們需要感直手機螢幕連貫性,而安卓系統流暢的幀率規定在60fps(每秒實現的幀數,換算過來就是每60毫秒一幀),為了保證不出現丟失幀數,我們一定要在16毫秒內處理完這次cpu和Gpu的計算、繪製和渲染操作。所以UI卡頓是可以量化的,每一次是否能夠成功渲染是非常重要的問題,16毫秒是一個很大的標準,能夠完整的做完一次操作,直接決定了卡頓效能問題,我們還需要知道每次java虛擬機器兼用GC的時候,所有的執行緒都會暫停,當GC完了之後,所有的執行緒才會繼續執行。也就是說正在進行16秒渲染的時候,正好遇到了大量的GC操作,就會導致渲染時間不夠,從而導致卡頓問題。

第二種:overdarw過多繪製(他的意思就是某一畫素在同一幀內,被繪製了很多次,多出現在多層次的UI中),加入你吧很多view設定為GONE時,他也會做繪製的操作,這就導致某些畫素區域被繪製很多次,這樣就浪費了cpu和gpu資源。

overdarw出現的原因:就是你UI佈局中有大量重疊的部分,還有時候是存在很多非必要的重疊背景,例如Activity有一個背景,如果layout又有自己的背景,同事layout中的子view又擁有自己的背景,這個時候你只要移除非必要存在的背景就可以減少紅色的overdarw,減少UI卡頓。

  • 總結:UI卡頓的主要根源就是來自於安卓的渲染效能,做了太多的耗時操作,做太多耗時操作的原因,layout太複雜、也有可能是UI上層疊了太多的其他layout佈局、還有就是你的動畫執行次數過多。

三、UI卡頓原因分析

答:

1、人為在UI執行緒做輕微耗時操作,導致UI執行緒卡頓;(UI卡頓是輕量版的anr,也就是說做了輕微的耗時操作,但是不至於引起anr異常的耗時操作)。

2、佈局layout過於複雜,無法在16秒內完成渲染。

3、同一時間動畫執行的次數過多,導致cpu或Gpu負載過重

4、View過度繪製,導致某些畫素在同一幀時間內被繪製多次,從而導致cpu或gpu負載過重。

5、View頻繁的觸發measure、layout、導致measure、layout累計耗時過多及整個View頻繁重新渲染。

6、記憶體頻繁觸發GC過多,導致暫時阻塞渲染操作。

7、無用資源及邏輯導致載入和執行緩慢

8、ANR


  • 建議

1、佈局優化,儘量不適用巢狀。

2、列表及adapter優化,列表在滑動的時候不要去進行資料更新操作。

3、背景和圖片等記憶體分配優化,儘量減少佈局當中不必要的背景設定,圖片儘量使用壓縮處理。

4、避免ANR

相關推薦

面試記錄——UI的問題

一、60fps 和 16ms的含義 很多時候使用者感覺UI卡頓,而造成這種卡頓的最主要根源是來源於渲染器,我們在開發過程中,大家再和UI溝通的時候就可以感覺到。一般我們在和UI工程師溝通的時候,他們總想把APP做的很絢麗、功能很豐富、圖片很大很清晰,提高使

面試記錄——bitmap釋放、lru、三級快取、圖片壓縮

一、recycle釋放記憶體問題 答: 在Android2.3.3(API 10)及之前的版本中,Bitmap物件與其畫素資料是分開儲存的,Bitmap物件儲存在Dalvik heap中,而Bitmap物件的畫素資料則儲存在Native Memor

學習筆記一類,第二類斯特林數和Bell數

正題       百度:“       在組合數學,Stirling數可指兩類數,第一類Stirling數和第二類Stirling數,都是由18世紀數學家James Stirling提出的。   

Spark修煉之道進階篇——Spark入門到精通: Spark Streaming與Kafka

作者:周志湖 主要內容 Spark Streaming與Kafka版的WordCount示例(一) Spark Streaming與Kafka版的WordCount示例(二) 1. Spark Streaming與Kafka版本的WordCount示例

Spring入門學習AOP返回通知&異常通知&環繞通知&切面的優先順序

Spring入門學習(AOP返回通知&異常通知&環繞通知) 返回通知 異常通知 環繞通知 切面的優先順序 返回通知 使用`@AfterReturning`註解,在方法正常結束後執行的通知,它是可以獲得方法的返回

python學習正則

image all flags 正則 asdf alt afa images lag python2和python3都有兩種字符串類型strbytes re模塊find一類的函數都是精確查找。字符串是模糊匹配 findall(pattern,string,flags) r

python學習筆記叠代和其他

技術分享 img 余數 商品列表 步長 取數 sorted函數 學習 四舍五入 yiled 面相過程編程 造好內容,統一發給下面 上面這個是傻瓜版 內置函數 print(divmod(10,3)) 將10除以3,顯示商和余數 enumerate函數,顯示元素及它

走入計算機的css語法二

font 最大 function 不但 err 劃線 目的 osi css屬性 一 屬性選擇器 E[att] 匹配所有具有att屬性的E元素,不考慮它的值。(註意:E在此處可以省略。 比如“[cheacked]”。以下同。

HTML學習筆記 w3sCss盒子模型應用 原創

.com foo margin images href ack har htm com <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> &l

HTML學習筆記 cs動畫基礎分列效果可用於做瀑布流 原創 參考使用表

har orm 顏色 無限 動畫 ext top 效果 rotate <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &

HTML學習筆記 cs2D3D展示基礎 原創 參考使用表

safari 學習筆記 ans com div2 s2d spa har tex <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

學習筆記

作業 學習筆記 第十六節課 lvm講解 lvm有很大的便利性,可以方便的擴容和縮容磁盤的空間。(但是也有局限性) 一旦出現問題,磁盤使用lvm,文件系統壞了,數據沒了,恢復數據的時候很麻煩。 做個實驗:創建三個磁盤分區,(這裏要註意下ID 是83,說明他是普通的分區。如果要想使用lvm,就要修改

HTML學習筆記 css定位靜態,相對,固定,絕對布局偏移案例 原創 參考使用表

absolute write style 用戶 學習 nbsp -c code posit <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"

【php增刪改查實例】 - 用戶新增

img dialog onsubmit null 允許 array 增刪改查 res UNC 6.1工具欄 <div id="toolbar"> <a href="javascript:openDialog()" class="easyu

java基礎 連接數據庫

ID 循環 exec manage () result creat AS 新的 連接數據庫(JDBC接口) 步驟如下: 先到數據庫jar包。 1.加載驅動 Class.forName("包路徑"); 例:Class.forName("com.mysql.jd

PMBOK(版) PMP筆記——《一》一章專案風險管理

第十一章 風險管理: 專案的獨特性導致專案充滿風險,專案風險是一種不確定的事件或條件,可能發生、將 要發生,也可能不發生。 已發生的消極風險可視為問題,問題又會引發風險。 7 個過程: 1、規劃風險管理:制定風險管理計劃,指導如何實施、開展專案的風險管理活動; 2、識別風險:識別專

PMBOK(版) PMP筆記——《二》二章專案採購管理

第十二章 專案採購管理 3 個過程: 1、規劃採購管理:做出採購決策、明確採購方法、識別潛在賣方、準備獲取建議; 2、實施採購:獲取賣方應答、選擇賣方、授予合同; 3、控制採購:管理採購關係、監督合同執行情況、根據需要變更和採取糾正措施;注意: 採購章節,我們是站在甲方的角度 其他

,使用函式封裝庫tf.contrib.layers

這一節,介紹TensorFlow中的一個封裝好的高階庫,裡面有前面講過的很多函式的高階封裝,使用這個高階庫來開發程式將會提高效率。 我們改寫第十三節的程式,卷積函式我們使用tf.contrib.layers.conv2d(),池化函式使用tf.contrib.layers.max_pool2d(

課:16,17章,Squid服務和iscsi網路儲存

第十六章 squid總結: 正向代理:yum  安裝後清空防火牆即可正常使用,客戶端設定瀏覽器 透明正向代理:vim  /etc/squid/squid.conf                 &

20181214

Squid是Linux系統中最為流行的一款高效能代理服務軟體, 通常用作Web網站的前置快取服務,能夠代替使用者向網站 伺服器請求頁面資料並進行快取。   硬碟介面型別主要有IDE、SCSI和SATA這3種 DE是一種成熟穩定、價格便宜的並行傳輸介面。 SATA是一種傳輸速度