iOS卡頓原因與優化

iOS卡頓原因與優化

1. 卡頓簡介

在這里插入圖片描述

卡頓: 指用戶在使用過程中出現了一段時間的阻塞,使得用戶在這一段時間內無法進行操作,屏幕上的內容也沒有任何的變化。

卡頓作為App的重要性能指標,不僅影響著用戶體驗,更關系到用戶留存、DAU等重要產品數據。因此,需要關注APP的卡頓

2. 卡頓產生的原因

首先,屏幕上看到的所有內容都是計算機繪制出來的圖像

幀率:Frames Per Second(fps),表示每秒渲染幀數,
通常用于衡量畫面的流暢度,每秒幀數越多,則表示畫面越流暢。

通常,60fps比較流暢,也就是60張/秒,每張圖片需要的渲染時間大約是:
1s/60張 = 1000ms/60張 = 16.7ms/1張

也就是1張圖像在16.7ms內出現一次,就不會造成卡頓現象。

在這里插入圖片描述

在這里插入圖片描述

  • CPU 中計算顯示內容,比如視圖的創建、布局計算、圖片解碼、文本繪制等
  • GPU 進行變換、合成、渲染,把渲染結果提交到幀緩沖區去,在下一次 VSync 信號到來時顯示到屏幕上

在這里插入圖片描述

卡頓產生的原因:當單位時間內,界面要刷新的時候,CPU或GPU由于計算量大,沒有做好準備,
就會造成界面顯示前一個時間段的界面,從而造成卡頓、掉幀現象

3. 如何避免卡頓

核心: 減少CPU、GPU的資源消耗

CPU

  1. 創建對象:對象的創建會分配內存、調整屬性,因此,盡量使用輕量級的對象
  2. 布局計算:視圖布局的計算是 App 中最為常見的消耗 CPU 資源的地方,不要頻繁的調用UIView的相關屬性;盡量提前計算好布局,在有需要時一次性調整到對應的屬性,不要多次、頻繁的計算和調整這些屬性
  3. 線程處理:控制一下線程的最大并發數量;盡量把耗時的操作放到子線程,包括:文本計算、布局計算、圖片的解碼編碼

GPU

  • 盡量避免短時間內大量圖片的顯示,盡可能將多張圖片合成一張進行顯示
  • GPU能處理的最大紋理尺寸是4096x4096,一旦超過這個尺寸,就會占用CPU的資源進行處理,所以紋理尺寸盡量不要超過這個尺寸
  • 盡量減少視圖數量和層次
  • 減少透明的視圖(alpha<1),不透明的就設置opaque為YES
  • 盡量避免出現離屏渲染

在OpenGL中,GPU有2種渲染方式:
1 當前屏幕渲染:在當前用于顯示的屏幕緩沖區進行渲染操作
2 離屏渲染:在當前屏幕緩沖區以外新開辟一個緩沖區進行渲染操作

離屏渲染消耗性能的原因?
  • 需要創建新的緩沖區
  • 離屏渲染的整個過程,需要多次切換上下文環境,先是從當前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結束以后,將離屏緩沖區的渲染結果顯示到屏幕上,又需要將上下文環境從離屏切換到當前屏幕
哪些操作會觸發離屏渲染?
  • 光柵化,layer.shouldRasterize = YES
  • 遮罩,layer.mask
  • 圓角,同時設置layer.masksToBounds = YES、layer.cornerRadius大于0考慮通過CoreGraphics繪制裁剪圓角,或者叫美工提供圓角圖片
  • 陰影,layer.shadowXXX,如果設置了layer.shadowPath就不會產生離屏渲染

4. 卡頓檢測

  • 監控FPS
  • 監控RunLoop
  • ping主線程

4.1 監控FPS

幀率:Frames Per Second(fps),表示每秒渲染幀數

在這里插入圖片描述

使用系統CADisplayLink監控,CADisplayLink是一個與屏幕刷新率相同的定時器,大約1/60s調用一次。

將其注冊到RunLoop里面,計算當前畫面的幀數。

delta為時間差等于1

在這里插入圖片描述

4.2 監控RunLoop

由于UI刷新只能在主線程操作,因此,平時所說的“卡頓”,主要是因為主線程執行了比較耗時的操作

因此,可以添加observer到主線程Runloop中,通過監聽Runloop狀態切換的耗時,以達到監控卡頓的目的

在這里插入圖片描述

RunLoop在BeforeSources和AfterWaiting后會進行任務的處理。可以在此時阻塞監控線程并設置超時時間,若超時后RunLoop的狀態仍為RunLoopBeforeSources或AfterWaiting,表明此時RunLoop仍然在處理任務,主線程發生了卡頓

在這里插入圖片描述

4.3 子線程Ping主線程

ping是常用的網絡測試工具,用來測試數據包能否到達ip地址。
在這里插入圖片描述

ping主線程的核心思想是向主線程發送一個信號,一定時間內收到了主線程的回復,即表示當前主線程流暢運行。
沒有收到主線程的回復,即表示當前主線程在做耗時運算,發生了卡頓。

子線程Ping主線程的實現思路:

  1. 創建一個子線程進行循環檢測,每次檢測時設置標記位為YES
  2. 然后派發任務到主線程中將標記位設置為NO。
  3. 接著子線程休眠設定的閾值,判斷標志位是否成功設置成NO,如果沒有說明主線程發生了卡頓。

相當于:
子線程設置一個標識YES

如果發生了主線程的卡頓,那么到規定時間,主線程內的代碼沒有執行,則標識還是YES,這時候,代表卡頓
如果沒有發生卡頓,那么到規定時間,主線程內的代碼執行,則表示變為NO,這時候,代表沒有發生卡頓

在這里插入圖片描述

總結

在這里插入圖片描述

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

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

相關文章

Maven插件之 maven-dependency-plugin 分析依賴復制文件

目錄 插件簡介使用示例配置依賴&#xff1a;執行 mvn dependency:analyze輸出結果&#xff1a; 結尾 插件簡介 Apache Maven Dependency Plugin是Apache Maven構建工具的一個插件&#xff0c;用于管理項目的依賴項。 該插件提供了一系列目標&#xff08;goals&#xff09;&…

Linux: shm_xx系列函數使用詳解

目錄 一、shmget/shmctl/shmat/shmdt函數1、shmget2、shmctl3、shmat4、shmdt5、補充&#xff1a;ftok函數6、示例代碼 二、shm_open/shm_unlink函數1、shm_open2、shm_unlink3、示例代碼 三、課外閱讀 一、shmget/shmctl/shmat/shmdt函數 shm_xx系列函數是用于操作共享內存的一…

SpringBoot整合JdbcTemplate

?作者簡介:大家好,我是Leo,熱愛Java后端開發者,一個想要與大家共同進步的男人???? ??個人主頁:Leo的博客 ??當前專欄: 循序漸進學SpringBoot ?特色專欄: MySQL學習 ??本文內容:SpringBoot整合JdbcTemplate ??個人知識庫: Leo知識庫,歡迎大家訪問 目錄 …

設置文字之間的間距應該如何實現

設置文字之間的間距&#xff0c;通常指的是字母之間&#xff08;字符間距&#xff09;或單詞之間的間距。在CSS中&#xff0c;這可以通過letter-spacing和word-spacing屬性來實現。 字符間距&#xff08;letter-spacing&#xff09; letter-spacing屬性用于調整字符之間的間距…

【Git學習筆記】提交PR

step1 克隆一個倉庫 git clone .....step2 創建一個分支 (Creating a branch) # 創建并切換到本地新分支&#xff0c;分支的命名盡量簡潔&#xff0c;并與解決的問題相關 git checkout -b delete-unused-linkstep3 做出修改 (Make changes) step4 提交修改 # 保存本地修…

DDR5內存相比DDR4內存的優勢和區別?選擇哪一個服務器內存配置能避免丟包和延遲高?

根據幻獸帕魯服務器的實際案例分析&#xff0c;選擇合適的DDR4與DDR5內存大小以避免丟包和延遲高&#xff0c;需要考慮以下幾個方面&#xff1a; 性能與延遲&#xff1a;DDR5內存相比DDR4在傳輸速率、帶寬、工作電壓等方面都有顯著提升&#xff0c;但同時也伴隨著更高的延遲。D…

PostgreSQL開發與實戰(4)查詢性能Top SQL

作者&#xff1a;太陽 一、查詢當前正在運行的Top SQL 查詢當前正在運行的會話中耗時最長的Top SQL&#xff0c;where條件可按需修改SELECT pgsa.datname AS database_name, pgsa.usename AS user_name, pgsa.client_addr AS client_addr, pgsa.application_name AS applicat…

你知道什么是回調函數嗎?

c語言中的小小白-CSDN博客c語言中的小小白關注算法,c,c語言,貪心算法,鏈表,mysql,動態規劃,后端,線性回歸,數據結構,排序算法領域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 給大家分享一句我很喜歡我話&#xff1a; 知不足而奮進&#xff0c;望遠山而前行&am…

Unity3D外包 北京動點軟件:基于U3D開發自動駕駛技術分析

在Unity3D中開發自動駕駛AI是一個充滿挑戰和潛力的領域。以下是一些關鍵步驟和考慮因素&#xff1a; 來百度APP暢享高清圖片 1. 創建虛擬環境&#xff1a; 使用Unity3D創建一個逼真的虛擬環境&#xff0c;模擬現實世界的道路、交通標志、車輛和障礙物等。 確保場景具有真實的…

4款免費且實用的.NET反編譯工具

.NET 反編譯工具的作用 .NET反編譯工具能夠將已經編譯好的.NET程序集轉換為易于理解的源代碼&#xff0c;它們可以幫助開發人員恢復丟失的源代碼、理解和分析第三方組件dll、學習其他人的代碼、更好的查找修復 bug 或進行逆向工程等&#xff08;注意&#xff1a;請在法律允許范…

【C++ 標準流,文件流】

C 標準流&#xff0c;文件流 ■ 標準輸入&#xff0c;輸出流&#xff0c;■ 文件流&#xff08;ofstream寫入&#xff0c;ifstream讀取&#xff0c;fstream創建-寫入-讀取&#xff09;■ open()■ ofstream■ ifstream■ 流插入<<■ 文件位置指針 ■ 標準輸入&#xff0c…

SpringBoot系列(一):SpringBoot介紹

SpringBoot系列(一)&#xff1a;SpringBoot介紹 1. SpringBoot介紹 SpringBoot是由Pivotal團隊提供的一套用于構建微服務的基礎框架&#xff0c;它旨在簡化Spring應用程序的創建和開發過程。 SpringBoot通過設計大量的自動化配置等方式來簡化Spring原有樣板化的配置&#xff…

用Visual Studio 2015成功編譯、發布UMDF驅動到目標機!!

開發工具&#xff1a;Visual Studio 2015企業版 主 機&#xff1a;windows10 X64企業版&#xff0c;主機是安裝了Visual Studio 2015的操作系統&#xff0c;主要進行驅動開發和調試。 目 標 機&#xff1a;windows10 X86企業版&#xff0c;目標機是安裝和調試驅動的操作…

阿里巴巴面試必備:數據庫集群知識全面解讀!

大家好,我是小米。今天,我們將深入探討阿里巴巴面試題中一個備受關注的話題:數據庫集群。作為技術領域中的一項重要實踐,數據庫集群不僅是企業架構中的核心組成部分,更是保障系統穩定性和數據可靠性的關鍵一環。讓我們一起來揭秘數據庫集群的奧秘吧! 主從復制過程 主從…

文件操作(超詳細版本)

本章重點 為什么使用文件什么是文件文件的打開和關閉文件的順序讀寫文件的隨機讀寫文件讀取結束的判定 為什么使用文件 我們前面學習結構體時&#xff0c;寫通訊錄的程序&#xff0c;當通訊錄運行起來的時候&#xff0c;可以給通訊錄中增加、刪除數 據&#xff0c;此時數據是…

手勢識別應用介紹

目錄 一、功能介紹 二、安裝部署說明 2.1 文件目錄說明 2.2 手勢識別部分 一、功能介紹 這是一個通過攝像頭捕獲手勢&#xff0c;根據不同的手勢來做出不同操作的計算機程序。目前可以識別9種手勢&#xff0c;可以根據識別到的手勢&#xff0c;進行打開應用、增大音量、減小音量…

[AIGC] 請舉例說明在運行時讀取注解的應用場景。

很高興你對于在運行時讀取注解的應用場景感興趣。以下是我為你整理的一些典型場景&#xff1a; 1. Spring框架 Spring框架廣泛地使用了運行時注解。例如Autowired注解&#xff0c;它可以在運行時實現依賴注入的功能。Spring在啟動時&#xff0c;會通過反射機制尋找到被Autowi…

mkfs.ext4 --- 對磁盤設備進行Ext4格式化

mkfs.ext4命令來自于英文詞組“make filesystem Ext4”的縮寫&#xff0c;其功能是用于對磁盤設備進行Ext4格式化的操作。 mkfs.ext4 參數-b block-size 塊大小&#xff08;1k,2k,4k&#xff09; -c 壞塊測試 -l filename從文件讀壞塊列表 -C cluster-size 簇大小 (大塊分配持性…

交友社交軟件開發-php交友聊天系統-

為了開發一個高效的交友系統&#xff0c;需要一個完善的信息管理和篩選機制。這個系統應該能夠根據用戶的個人信息、興趣愛好、價值觀等標準進行篩選&#xff0c;并向用戶提供符合他們要求心儀的人的信息。為了實現這個目標&#xff0c;系統可以利用人工智能技術&#xff0c;分…

MySQL基礎-----SQL語句之DDL語句

目錄 前言 開啟登錄數據庫 一、數據庫操作 1.查詢所有數據庫 2.切換使用數據庫 3.查詢當前使用的數據庫 4.創建數據庫 創建一個hello數據庫, 使用數據庫默認的字符集。 創建一個itheima數據庫&#xff0c;并且指定字符集 5.刪除數據庫 二、表操作 1.查詢當前數據庫所有…