CPU-中央處理器
對(duì)象的創(chuàng)建和銷毀肖揣,對(duì)象屬性的調(diào)整,布局計(jì)算可免,文本的計(jì)算和排版抓于,圖片的格式轉(zhuǎn)換和解碼,圖像的繪制
GPU-圖形處理器
紋理的渲染浇借,最大紋理尺寸是4096x4096
CPU——計(jì)算——GPU——渲染——幀緩存——讀取——視頻控制器——顯示——屏幕
IOS是雙緩存機(jī)制捉撮,前幀緩存,后幀緩存
按照60FPS的刷幀率妇垢,每隔16ms就會(huì)有一次VSync信號(hào)
卡頓解決的主要思路:
盡可能減少CPU巾遭,GPU資源消耗
CPU的優(yōu)化:
1.盡量用輕量級(jí)的對(duì)象,比如用不到事件處理的地方闯估,可以考慮使用CALayer取代UIView
2.不要頻繁的調(diào)用UIView的相關(guān)屬性灼舍,比如frame,bounds,transform等屬性,盡量減少不必要的修改
3.盡量提前計(jì)算好布局
4.Autolayout會(huì)比直接設(shè)置frame消耗更多的CUP資源
5.圖片的size最好剛好跟UIImageView的size保持一致
6.控制線程的最大并發(fā)數(shù)量
7.盡量把耗時(shí)的操作放到子線程
? ? 文本處理(尺寸計(jì)算涨薪,繪制)圖片處理(解碼骑素,繪制)
GPU優(yōu)化
1.盡量避免短時(shí)間內(nèi)大量圖片的顯示,盡可能將多張圖片合成一張進(jìn)行顯示
2.盡量較少視圖數(shù)量和層次
3.減少透明的視圖刚夺,不透明的就設(shè)置opaque為YES
4.盡量避免出現(xiàn)離屏渲染
耗電優(yōu)化:
1.少用定時(shí)器
2.優(yōu)化I/O操作
3.數(shù)據(jù)量大的盡量使用數(shù)據(jù)庫
4.減少献丑,壓縮網(wǎng)絡(luò)數(shù)據(jù)
5.緩存
6.斷點(diǎn)續(xù)傳
APP啟動(dòng)優(yōu)化,主要針對(duì)冷啟動(dòng)進(jìn)行優(yōu)化
1.通過添加環(huán)境變量可以打印出APP的啟動(dòng)時(shí)間分析(Edit scheme -> Run -> Arguments)
DYLD_PRINT_STATISTICS_DETAILS設(shè)置為1,400毫秒以內(nèi)屬于正常
dylib loading time:加載動(dòng)態(tài)庫所需的時(shí)間
rebase將鏡像讀入內(nèi)存光督,修正鏡像內(nèi)部的指針阳距,性能消耗主要在IO。
bind是查詢符號(hào)表结借,設(shè)置指向鏡像外部的指針筐摘,性能消耗主要在CPU計(jì)算。
Objc setup
runtime會(huì)維護(hù)一張類名與類的方法列表的全局表船老。
讀取所有類咖熟,將類對(duì)象其注冊(cè)到這個(gè)全局表中(class registration)
讀取所有分類,把分類加載到類對(duì)象中(category registration)
檢查selector的唯一性(selector uniquing)
initalizer time:執(zhí)行l(wèi)oad方法的耗時(shí)
冷啟動(dòng)的三大階段:1.dyld 2.runtime 3.main
1.dyld:Apple的動(dòng)態(tài)連接器柳畔,可以用來裝在Mach-0文件
優(yōu)化:
減少動(dòng)態(tài)庫馍管,合并一些動(dòng)態(tài)庫
減少Objc類,分類的數(shù)量薪韩,減少Selector數(shù)量确沸,定期清理沒有使用的類捌锭,分類
減少C++虛函數(shù)數(shù)量
swift盡量使用struct代替類
2.runtime:
調(diào)用map_images進(jìn)行可執(zhí)行文件內(nèi)容的解析和處理
在load_images中調(diào)用call_load_methods,調(diào)用所有Class和Category的+load方法
進(jìn)行各種objc結(jié)構(gòu)的初始化(注冊(cè)O(shè)bjc類,初始化類對(duì)象等)
通過C++靜態(tài)初始化器和_attribute_((constructor))修飾的函數(shù)
到此為止罗捎,可執(zhí)行文件和動(dòng)態(tài)庫中的所有符號(hào)(Class,Protocol,Selector,IMP...)都已經(jīng)按格式成功加載到內(nèi)存中观谦,被runtime所管理
優(yōu)化:用+initialize+單例代替+load
3.調(diào)用main函數(shù)
優(yōu)化:在不影響用戶體驗(yàn)的前提下,盡可能將一些操作延遲桨菜,不要全部放在finishLaunching中
4.二進(jìn)制重排https://juejin.cn/post/6844904174287585287
APP瘦身:
1.資源進(jìn)行無損壓縮
2.去除沒有用到的資源:https://github.com/tinymind/LSUnusedResources
3.可執(zhí)行文件的瘦身
編譯器優(yōu)化:Strip Linked Product,Make Strings Read-Only,Symbols Hidden By Default設(shè)置為YES
去掉異常支持:Enable C++ Exceptions,Enable Objective-C Exceptions設(shè)置為NO豁状,Other C Flags添加-fno-exceptions
4.檢測未使用的代碼