隨著互聯(lián)網(wǎng)快速發(fā)展腥光,移動互聯(lián)網(wǎng)也跟著快速的發(fā)展起來懒构,導致出現(xiàn)了很多各種各樣的APP众羡,很多主流的APP也培養(yǎng)了用戶的某些用戶習慣,用戶也越來越注重APP用戶體驗嗦嗡,APP加載慢就是其中讓用戶很頭疼體驗很差的一樣問題勋锤,那么APP加載慢一般是由什么原因?qū)е碌模?/p>
APP加載慢一般可以從這幾個方面去了解
一、APP啟動加載慢
APP啟動大體分為三個步驟侥祭,可執(zhí)行文件加載叁执、mian()函數(shù)執(zhí)行后、首屏渲染完成后
1矮冬、可執(zhí)行文件加載
iOS加載APP的一些 .O文件谈宛,
加載動態(tài)鏈接庫,
指針調(diào)整胎署,bind符號的綁定吆录,
運行時初始化處理,(初始化琼牧,包括了執(zhí)行 +load() 方法恢筝、attribute((constructor)) 修飾的函數(shù)的調(diào)用、創(chuàng)建)
項目里各相關(guān)類的注冊巨坊,category 注冊撬槽,
檢查各類的唯一性
那在執(zhí)行這些程序的時候怎么導致加載慢呢?
1趾撵、如果是動態(tài)庫特別多的話侄柔,就會導致加載慢,所以我們盡量減少動態(tài)庫的加載占调,蘋果建議如果加載時動態(tài)庫較多的話勋拟,可以把動態(tài)庫合并使用,蘋果允許最多6個非系統(tǒng)動態(tài)庫合并成一個
2妈候、減少加載后不會使用的類和方法 ,+load() 方法里的內(nèi)容可以放到首屏渲染完成后再執(zhí)行挂滓,或使用 +initialize() 方法替換掉苦银。因為,在一個 +load() 方法里,進行運行時方法替換操作會帶來 4 毫秒的消耗幔虏。不要小看這 4 毫秒纺念,積少成多,執(zhí)行 +load() 方法對啟動速度的影響會越來越大
3想括、控制C++的全局變量數(shù)
2陷谱、mian()函數(shù)執(zhí)行后
這個時間階段主要是mian()函數(shù)后,一直到AppDelegate里面- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {}方法里關(guān)于首頁的相關(guān)方法以及渲染屏幕執(zhí)行完成瑟蜈。
我們在開發(fā)項目的時候烟逊,很多會把各種初始化的工作放在這個階段執(zhí)行,這樣就會影響渲染完成慢铺根,從用戶的角度來說宪躯,也就是加載慢的問題。
那我們該怎優(yōu)化這類問題呢位迂,應該是從功能上梳理出哪些是首頁渲染需要初始化的功能访雪,哪些是APP啟動需要的初始化功能,哪些是只需要在對應的模塊功能使用的時候才需要的初始化的功能掂林,然后再把這些初始化的任務放在相對應的合適位置去執(zhí)行
3臣缀、首屏渲染完成后
這個階段主要是從渲染完成時開始,到?didFinishLaunchingWithOptions:?方法作用域結(jié)束時結(jié)束泻帮。
通俗來說就是 首頁的排版精置、繪制、UI對象操作刑顺。
如果一個首頁相對較復雜的話氯窍,就會涉及到很多圖片和UI繪制渲染,同時也會有很多接口調(diào)用蹲堂,這時候如果我們的程序員編寫的時候不注意狼讨,都放在主線程里執(zhí)行的話,就會阻塞UI對象操作的柒竞,然后出現(xiàn)加載慢的情況
二政供、APP界面卡頓
一般APP界面卡頓主要是因為CPU占用太高,系統(tǒng)中CPU/GPU/顯示器是協(xié)調(diào)工作的朽基,CPU計算好顯示內(nèi)容提交到GPU,GPU渲染完成后將渲染結(jié)果放入幀緩沖區(qū),隨后視頻控制器會按照VSync 信號逐行讀取幀緩沖區(qū)的數(shù)據(jù),經(jīng)過可能的轉(zhuǎn)換傳遞給顯示器顯示.
App主線程開始在CPU中計算顯示內(nèi)容, 比如視圖的創(chuàng)建/布局計算/圖片解碼/文本繪制等. 隨后CPU會將計算好的內(nèi)容提交到 GPU去, 由GPU進行變換/合成/渲染. 隨后GPU 會把渲染結(jié)果提交到幀緩沖區(qū)去,等待下一次 VSync信號到來時顯示到屏幕上. 由于垂直同步的機制, 如果在一個 VSync 時間內(nèi), CPU或者 GPU 沒有完成內(nèi)容提交, 則那一幀就會被丟棄, 等待下一次機會再顯示,而這時顯示屏會保留之前的內(nèi)容不變,這就是界面卡頓的原因布隔。
所以對象創(chuàng)建、對象調(diào)整稼虎、對象釋放衅檀、布局計算、文本計算霎俩、文本渲染哀军、圖片解碼沉眶、圖像渲染這些都有可能導致我們界面卡頓的原因;
這就要求我們在寫代碼的時候
1杉适、盡量推遲對象創(chuàng)建的時間谎倔,并且盡量把創(chuàng)建的對象放在多個任務里去執(zhí)行
2、如 frame/bounds/transform 等實際上都是 CALayer 屬性映射來的, 所以對UIView 的這些屬性進行調(diào)整時, 消耗資源要遠大于一般的屬性. 對此你在應用中,盡量減少不必要的屬性修改
3猿推、對象釋放的時候盡量放到后臺去執(zhí)行片习,或者使用自動釋放
4、盡量少使用圓角蹬叭、陰影這樣的對象屬性藕咏,圖片加載時候使用預加載方式
三、APP網(wǎng)絡請求加載慢
網(wǎng)絡請求加載慢一般情況除了手機網(wǎng)本身網(wǎng)絡慢以外具垫,還有可能是我們同時在執(zhí)行多個網(wǎng)絡請求侈离,阻塞了線程。
前面分享了關(guān)于加載慢的幾種情況筝蚕,接下來說一下如何去監(jiān)控這些慢的問題
監(jiān)控APP加載實際上是監(jiān)控APP的性能問題,所以第一:監(jiān)控CPU的占用率卦碾,第二、監(jiān)控內(nèi)存使用率起宽,第三洲胖、監(jiān)控URL的響應時間
1二鳄、AppDelegate 里獲取APP所占用的CPU
2蓄坏、獲取當前任務所占用的內(nèi)存
3晤柄、獲取APP的流暢度
4析显、監(jiān)控URL的響應時間
最后總結(jié)一下,我們所做的這些監(jiān)控柴墩,只是側(cè)面輔助檢查優(yōu)化我們寫的代碼摹恨,最根本還是要從項目開始的時候設計好架構(gòu)框架登下,編寫代碼的時候多注意這些相關(guān)問題藻糖,盡量減少上面講到的問題出現(xiàn)淹冰,這是我們作為程序猿更應該去關(guān)心和提升的地方。對APP加載慢和如何監(jiān)控的問題巨柒,就說到這里樱拴,有未完整或者不對的地方歡迎留言溝通和指正。