SurfaceFlinger及Android應用RenderThread角度觀察Jank丟幀卡頓

SurfaceFlinger及Android應用RenderThread角度觀察Jank丟幀卡頓


CPU、GPU、Display 三個部分:CPU 負責計算幀數據,把計算好的數據交給 GPU,GPU 會對圖形數據進行渲染,渲染好后放到 buffer (圖像緩沖區)存起來,然后 Display (屏幕或顯示器)把 Buffer呈現到屏幕。
Google 在 Android 4.1 系統中對 Android Display 系統進行了重構,引入了 Project Butter(黃油計劃):在系統收到 Vsync 信號后,上層 CPU 和 GPU 馬上進行下一幀畫面數據的處理,完成后及時將數據寫入到 Buffer 中,Google 稱之為 Drawing with Vsync。
在ViewRootImpl中完成對界面的measure、layout和draw等繪制流程后,用戶依然還是看不到內容,因為Android系統的顯示流程除了UI 線程的繪制外,還需要經過RenderThread線程的渲染處理,渲染完成后,還需要通過Binder調用“上幀”交給surfaceflinger進程進行合成后才能最終顯示到屏幕上。
Android應用渲染流程中,應用扮演的是生產者角色,SurfaceFlinger扮演的是消費者,工作的流程如下:
應用在開始繪制渲染之前,需要通過調用dequeueBuffer從SurfaceFlinger管理的BufferQueue 申請一處于free狀態的可用Buffer,如果此時沒有可用Buffer則阻塞等待;
應用拿到可用的Buffer后,使用GPU繪制渲染,渲染完成后再通過Binder調用queueBuffer將數據返回給應用進程對應的BufferQueue,如果是 GPU 渲染的話,這里還有個 GPU處理的過程,所以這個 Buffer 不會馬上可用,需要等 GPU 渲染完成的Fence信號,并申請sf的Vsync-sf喚醒消費者SurfaceFlinger進行消費;
SurfaceFlinger 收到 Vsync-sf 信號之后,開始準備合成,使用 acquireBuffer獲取應用對應的 BufferQueue 中的 Buffer 并進行合成操作;
合成結束后,SurfaceFlinger 調用 releaseBuffer將 Buffer 置為可用的free狀態,返回到應用對應的 BufferQueue中。
從 SurfaceFlinger 角度來說,在 App 連續的動畫或者手指滑動列表時(關鍵是連續),如果有一個 Vsync 到來時候 ,App 沒有可以用來合成的 Buffer,那么這個 Vsync 周期 SurfaceFlinger 就不會走合成邏輯(或者是去合成其他的 Layer),那么這一幀就會顯示 App 的上一幀的畫面,這里發生了卡頓;
從App的角度來看,如果渲染線程在一個 Vsync 周期內沒有 queueBuffer 到 SurfaceFlinger 中 App 對應的 BufferQueue 中,那么我們認為這里發生了卡頓。
如果線程Running時長過長導致運行變慢,最終出現上幀超時而掉幀,就需要結合具體tag信息查看到底在執行什么邏輯,然后結合自身的代碼實現看是否可以優化。或者看看當前JIT線程任務是否繁忙,判斷是否是因為應用沒有被及時編譯成機器碼而導致運行時長過長。
出于功耗節能的原因,VSYNC-sf與VSYNC-app并不一定會固定不停觸發。如果app或sf并沒有刷新畫面的需求,那么觸發信號進行繪制和合成是不必要的(功耗)。觸發VSYNC-sf和VSYNC-app的兩個EventThread會在requestNextVsync調用后才會將下一個VSYNC-sf或VSYNC-app發出。因此,當(各自EventThread)requestNextVsync沒有調用時,VSYNC-app和VSYNC-sf也就出現異常。BufferQueueLayer::onFrameAvailable會在應用提交后調用,該方法通過調用SF的signalLayerUpdate觸發產生下一個VSYNC-sf。

Android trace presentFence屏幕顯示的幀-CSDN博客文章瀏覽閱讀807次,點贊20次,收藏21次。在Android系統中,presentFence是屏幕顯示幀的關鍵信號,當幀成功顯示時,presentFence會發出信號。FrameMissed、GpuFrameMissed和HwcFrameMissed表示上一次合成的結果,SurfaceFlinger在每次被Vsync-sf喚醒時會檢查上一次合成的presentFence是否已發出信號,若未發出則認為是幀丟失。BufferTx在queueBuffer后增加,在SurfaceFlinger合成時減少,其內有可用Buffer時,SurfaceFlinger https://blog.csdn.net/zhangphil/article/details/148099387

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82026.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《牛客》數組中出現次數超過一半的數字

牛客的刷題之路不停歇 ??? 不積跬步無以至千里,不積小流無以成江海 The harder you work,the luckier you will be 題目及示例 題目鏈接 描述 給一個長度為 n 的數組,數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。 例…

七彩喜康養護理——科技賦能下的全周期健康守護

在當今社會,隨著人們健康意識的不斷提高,護理行業逐漸走向專業化、精細化,而七彩喜智養護理作為一種新興的護理方式,逐漸受到了廣泛的關注和應用。 它不僅僅是針對單一病癥的治療護理,而是一種全面的、全方位的健康管…

【爬蟲】12306自動化購票

上文: 【爬蟲】12306查票-CSDN博客 下面是簡單的自動化進行搶票,只寫到預定票,沒有寫完登陸, 跳出登陸后與上述代碼同理修改即可。 感覺xpath最簡單,復制粘貼: 還有很多寫法: 官網地址&#…

Java設計模式之組合模式:從入門到精通(保姆級教程)

文章目錄 1. 組合模式概述1.1 專業定義1.2 通俗解釋1.3 模式結構2. 組合模式詳細解析2.1 模式優缺點2.2 適用場景3. 組合模式實現詳解3.1 基礎實現3.2 代碼解析4. 組合模式進階應用4.1 透明式 vs 安全式組合模式4.2 組合模式與遞歸4.3 組合模式與迭代器5. 組合模式在實際開發中…

游戲如何應對反編譯工具dnspy

Unity Mono 是 Unity 引擎默認的腳本運行時環境,由跨平臺的開源 .NET 框架實現,它允許開發者使用 C# 等編程語言編寫游戲邏輯,憑借簡單易用的開發環境和高效的腳本編譯速度,得到了眾多游戲的青睞。 在 Mono 模式下,游…

騰訊云證書過期提醒的應對措施,Caddy 自動管理的 Let‘s Encrypt 證書.

用騰訊的免費證書,90天需要換一次。 Caddy 自動管理的 Lets Encrypt 證書. 在網站上按F12然后找到security選項,然后選擇View certifcate 就可以看到證書的有效期。 完全無需操作 你的網站實際使用的是 Caddy 自動管理的 Lets Encrypt 證書,…

[Java實戰]Spring Boot整合Elasticsearch(二十六)

[Java實戰]Spring Boot整合Elasticsearch(二十六) 摘要:本文通過完整的實戰演示,詳細講解如何在Spring Boot項目中整合Elasticsearch,實現數據的存儲、檢索和復雜查詢功能。包含版本適配方案、Spring Data Elasticsea…

【關聯git本地倉庫,上傳項目到github】

目錄 1.下載git2.綁定用戶3.git本地與遠程倉庫交互4.github項目創建5.上傳本地項目到github6.完結撒花???!!! 1.下載git git下載地址:https://git-scm.com/downloads 下載安裝后創建快捷地址:(此處比較…

[Vue]路由基礎使用和路徑傳參

實際項目中不可能就一個頁面,會有很多個頁面。在Vue里面,頁面與頁面之間的跳轉和傳參會使用我們的路由: vue-router 基礎使用 要使用我們需要先給我們的項目添加依賴:vue-router。使用命令下載: npm install vue-router 使用路由會涉及到下面幾個對象:…

軟考-軟件工程開發模型

軟考-軟件工程開發模型 參考視頻: 軟件工程概述&開發模型 ,配合視頻理解更清晰~ 軟件的生命周期為:需求分析、軟件設計、軟件開發、運行維護直至被淘汰 幾個階段。 軟件工程支持 4 個活動,簡稱 PDCA&#xff0c…

【寫在創作紀念日】基于SpringBoot和PostGIS的各省東西南北四至極點區縣可視化

目錄 前言 一、空間檢索簡介 1、空間表結構 2、四至空間檢索 二、前后端實現 1、后端實現 2、前端集成 三、成果展示 1、東部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、總結 前言 在當今數字化時代,地理信息數據的分析與可視化對于眾…

智能守護校園“舌尖安全“:AI視頻分析賦能名廚亮灶新時代

引言: 在校園食品安全備受關注的今天,一套融合視頻監控管理平臺與AI視頻分析盒子的智能解決方案正在全國多地學校食堂悄然落地,為傳統的"名廚亮灶"工程注入科技新動能。這套系統不僅實現了后廚操作的"透明化"&#xff0…

【軟件設計師】計算機網絡考點整理

以下是軟件設計師考試中 ??計算機網絡?? 的核心考點總結,幫助您高效備考: ??一、網絡體系結構與協議?? ??OSI七層模型 & TCP/IP四層模型?? 各層功能(物理層-數據鏈路層-網絡層-傳輸層-會話層-表示層-應用層)對應協…

Starrocks的CBO基石--統計信息的來源 StatisticAutoCollector

背景 本文來從底層代碼的實現來分析一下Starrocks怎么獲取統計信息,這些統計信息在后續基于CBO的代價計算的時候有著重要的作用 本文基于Starrrocks 3.3.5 結論 Starrocks的統計信息的收集是通過周期性的運行一系列的SQL(以分區為維度,如果…

深度學習模型部署(四)——RKNN

一、RKNN部署及工具包安裝 參考1:https://blog.csdn.net/qq_40280673/article/details/136211086#/ 參考2:瑞芯微官方教程 RKNN部署針對瑞芯微芯片優化,支持NPU硬件加速,需要安裝rknn-toolkit,用于將pytorch模型轉換為…

重構研發效能:項目管理引領軟件工廠邁向智能化

1.項目管理智能化,激活軟件工廠新引擎 在高速發展的軟件開發時代,企業如何高效管理多個項目、協調團隊合作、優化資源配置,已成為推動技術進步的關鍵。尤其是在多任務、多項目并行的復雜環境下,智能項目組合管理工具正成為軟件工…

小米汽車二期工廠下月將竣工,產能提升助力市場拓展

在新能源汽車市場競爭日益激烈的當下,小米汽車傳來重要進展消息。據多方信息顯示,小米汽車二期工廠下月即將竣工,這一關鍵節點的到來,有望為小米汽車的產能提升與市場布局帶來重大突破。? 小米汽車二期工廠位于北京亦莊&#xff…

Python 爬蟲實戰:電競比賽直播數據實時抓取與可視化分析

一、引言 在電競行業快速發展的今天,電競比賽直播數據成為了電競愛好者、分析師和商業機構關注的焦點。實時抓取電競比賽直播數據并進行分析,不僅可以幫助觀眾更好地理解比賽,還能為戰隊戰術優化、選手表現評估以及賽事運營提供重要參考。 本文將詳細介紹如何使用Python爬…

零基礎設計模式——創建型模式 - 生成器模式

第二部分:創建型模式 - 生成器模式 (Builder Pattern) 前面我們學習了單例、工廠方法和抽象工廠模式,它們都關注如何創建對象。生成器模式(也常被稱為建造者模式)是另一種創建型模式,它專注于將一個復雜對象的構建過程…

Debezium快照事件監聽器系統設計

Debezium快照事件監聽器系統設計 1. 系統概述 1.1 設計目標 為 Debezium 的快照過程提供可擴展的事件監聽機制允許外部系統在快照過程中執行自定義邏輯提供線程安全的事件分發機制確保監聽器的異常不會影響主快照流程1.2 核心功能 表快照開始事件監聽表快照完成事件監聽行數據…