2.5 再看卡頓的成因經(jīng)過上面的討論 , 我們得出一個卡頓分析的核心理論支撐:渲染機制中的任何流轉(zhuǎn)過程發(fā)生異常 , 均會造成卡頓 。
那么接下來 , 我們逐個分析 , 看看都會有哪些原因可能造成卡頓 。
2.5.1 渲染流程
- Vsync 調(diào)度:這個是起始點 , 但是調(diào)度的過程會經(jīng)過線程切換以及一些委派的邏輯 , 有可能造成卡頓 , 但是一般可能性比較小 , 我們也基本無法介入;
- 消息調(diào)度:主要是 doframe Message 的調(diào)度 , 這就是一個普通的 Handler 調(diào)度 , 如果這個調(diào)度被其他的 Message 阻塞產(chǎn)生了時延 , 會直接導致后續(xù)的所有流程不會被觸發(fā) 。這里直播建立了一個 FWtachDog 機制 , 可以通過優(yōu)化消息調(diào)度達到插幀的效果 , 使得界面更加流暢;
- input 處理:input 是一次 Vsync 調(diào)度最先執(zhí)行的邏輯 , 主要處理 input 事件 。如果有大量的事件堆積或者在事件分發(fā)邏輯中加入大量耗時業(yè)務邏輯 , 會造成當前幀的時長被拉大 , 造成卡頓 。抖音基礎技術同學也有嘗試過事件采樣的方案 , 減少 event 的處理 , 取得了不錯的效果;
- 動畫處理:主要是 animator 動畫的更新 , 同理 , 動畫數(shù)量過多 , 或者動畫的更新中有比較耗時的邏輯 , 也會造成當前幀的渲染卡頓 。對動畫的降幀和降復雜度其實解決的就是這個問題;
- view 處理:主要是接下來的三大流程 , 過度繪制、頻繁刷新、復雜的視圖效果都是此處造成卡頓的主要原因 。比如我們平時所說的降低頁面層級 , 主要解決的就是這個問題;
- measure/layout/draw:view 渲染的三大流程 , 因為涉及到遍歷和高頻執(zhí)行 , 所以這里涉及到的耗時問題均會被放大 , 比如我們會降不能在 draw 里面調(diào)用耗時函數(shù) , 不能 new 對象等等;
- DisplayList 的更新:這里主要是 canvas 和 displaylist 的映射 , 一般不會存在卡頓問題 , 反而可能存在映射失敗導致的顯示問題;
- OpenGL 指令轉(zhuǎn)換:這里主要是將 canvas 的命令轉(zhuǎn)換為 OpenGL 的指令 , 一般不存在問題 。不過這里倒是有一個可以探索的點 , 會不會存在一類特殊的 canvas 指令 , 轉(zhuǎn)換后的 OpenGL 指令消耗比較大 , 進而導致 GPU 的損耗?有了解的同學可以探討一下;
- buffer 交換:這里主要指 OpenGL 指令集交換給 GPU , 這個一般和指令的復雜度有關 。一個有意思的事兒是這里一度被我們作為線上采集 GPU 指標的數(shù)據(jù)源 , 但是由于多緩沖的因素數(shù)據(jù)準確度不夠被放棄了;
- GPU 處理:顧名思義 , 這里是 GPU 對數(shù)據(jù)的處理 , 耗時主要和任務量和紋理復雜度有關 。這也就是我們降低 GPU 負載有助于降低卡頓的原因;
- layer 合成:這里主要是 layer 的 compose 的工作 , 一般接觸不到 。偶爾發(fā)現(xiàn) sf 的 vsync 信號被 delay 的情況 , 造成 buffer 供應不及時 , 暫時還不清楚原因;
- 光柵化/Display:這里暫時忽略 , 底層系統(tǒng)行為;
- Buffer 切換:主要是屏幕的顯示 , 這里 buffer 的數(shù)量也會影響幀的整體延遲 , 不過是系統(tǒng)行為 , 不能干預 。
以上關于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫(yī)或請專業(yè)人士給予相關指導!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 淘寶直播等多個平臺賬號已被封 淘寶直播被當錄播封了
- 直播聲卡入門知識 什么是直播聲卡
- 快手怎么開通直播功能 快手直播怎么開
- 新手開直播多久能賺錢 美妝博主怎么賺錢
- 老王直播送iqoo8手機 iqoo7直播
- 加來眾科AK8Pro數(shù)字直播聲卡
- 新手如何從0開始做直播 直播間怎么開
- 讀懂佳能相機的系列型號
- 搞耍是什么意思
- 網(wǎng)絡電視看直播不清楚怎么回事 網(wǎng)絡電視看直播為什么會卡
