性能優(yōu)化

CPU和GPU

  • 在屏幕成像的過程中,CPU和GPU起著至關(guān)重要的作用
  • CPU(Central Processing Unit都弹,中央處理器)
    對象的創(chuàng)建和銷毀仁锯、對象屬性的調(diào)整、布局計算此洲、文本的計算和排版厂汗、圖片的格式轉(zhuǎn)換和解碼、圖像的繪制(Core Graphics)
  • GPU(Graphics Processing Unit呜师,圖形處理器)紋理的渲染
  • 在iOS中是雙緩沖機(jī)制娶桦,有前幀緩存、后幀緩存


    image.png

卡頓解決的主要思路

  • 盡可能減少CPU汁汗、GPU資源消耗
  • 按照60FPS的刷幀率衷畦,每隔16ms就會有一次VSync信號

卡頓優(yōu)化 - CPU

  • 盡量用輕量級的對象,比如用不到事件處理的地方知牌,可以考慮使用CALayer取代UIView
  • 不要頻繁地調(diào)用UIView的相關(guān)屬性祈争,比如frame、bounds送爸、transform等屬性铛嘱,盡量減少不必要的修改
  • 盡量提前計算好布局,在有需要時一次性調(diào)整對應(yīng)的屬性袭厂,不要多次修改屬性
  • Autolayout會比直接設(shè)置frame消耗更多的CPU資源
  • 圖片的size最好剛好跟UIImageView的size保持一致
  • 控制一下線程的最大并發(fā)數(shù)量
  • 盡量把耗時的操作放到子線程
    文本處理(尺寸計算墨吓、繪制)
    圖片處理(解碼、繪制)

卡頓優(yōu)化 - GPU

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

離屏渲染

  • 在OpenGL中照卦,GPU有2種渲染方式
    On-Screen Rendering:當(dāng)前屏幕渲染,在當(dāng)前用于顯示的屏幕緩沖區(qū)進(jìn)行渲染操作
    Off-Screen Rendering:離屏渲染乡摹,在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進(jìn)行渲染操作

離屏渲染消耗性能的原因

  • 需要創(chuàng)建新的緩沖區(qū)
    離屏渲染的整個過程役耕,需要多次切換上下文環(huán)境,先是從當(dāng)前屏幕(On-Screen)切換到離屏(Off-Screen)聪廉;等到離屏渲染結(jié)束以后瞬痘,將離屏緩沖區(qū)的渲染結(jié)果顯示到屏幕上,又需要將上下文環(huán)境從離屏切換到當(dāng)前屏幕

哪些操作會觸發(fā)離屏渲染板熊?

  • 光柵化框全,layer.shouldRasterize = YES

  • 遮罩,layer.mask

  • 圓角干签,同時設(shè)置layer.masksToBounds = YES津辩、layer.cornerRadius大于0
    考慮通過CoreGraphics繪制裁剪圓角,或者叫美工提供圓角圖片

  • 陰影容劳,layer.shadowXXX
    如果設(shè)置了layer.shadowPath就不會產(chǎn)生離屏渲染

耗電的主要來源

  • CPU處理喘沿,Processing
  • 網(wǎng)絡(luò),Networking
  • 定位鸭蛙,Location
  • 圖像摹恨,Graphics

耗電優(yōu)化

  • 盡可能降低CPU、GPU功耗

  • 少用定時器

  • 優(yōu)化I/O操作
    盡量不要頻繁寫入小數(shù)據(jù)娶视,最好批量一次性寫入
    讀寫大量重要數(shù)據(jù)時晒哄,考慮用dispatch_io,其提供了基于GCD的異步操作文件I/O的API肪获。用dispatch_io系統(tǒng)會優(yōu)化磁盤訪問
    數(shù)據(jù)量比較大的寝凌,建議使用數(shù)據(jù)庫(比如SQLite、CoreData)

  • 網(wǎng)絡(luò)優(yōu)化

  1. 減少孝赫、壓縮網(wǎng)絡(luò)數(shù)據(jù)
    如果多次請求的結(jié)果是相同的较木,盡量使用緩存
    使用斷點續(xù)傳,否則網(wǎng)絡(luò)不穩(wěn)定時可能多次傳輸相同的內(nèi)容
    網(wǎng)絡(luò)不可用時青柄,不要嘗試執(zhí)行網(wǎng)絡(luò)請求
    讓用戶可以取消長時間運行或者速度很慢的網(wǎng)絡(luò)操作伐债,設(shè)置合適的超時時間
  2. 批量傳輸,比如致开,下載視頻流時峰锁,不要傳輸很小的數(shù)據(jù)包,直接下載整個文件或者一大塊一大塊地下載双戳。如果下載廣告虹蒋,一次性多下載一些,然后再慢慢展示。如果下載電子郵件魄衅,一次下載多封峭竣,不要一封一封地下載
  • 定位優(yōu)化
    如果只是需要快速確定用戶位置,最好用CLLocationManager的requestLocation方法晃虫。定位完成后皆撩,會自動讓定位硬件斷電
    如果不是導(dǎo)航應(yīng)用,盡量不要實時更新位置傲茄,定位完畢就關(guān)掉定位服務(wù)
    盡量降低定位精度毅访,比如盡量不要使用精度最高的kCLLocationAccuracyBest
    需要后臺定位時,盡量設(shè)置pausesLocationUpdatesAutomatically為YES盘榨,如果用戶不太可能移動的時候系統(tǒng)會自動暫停位置更新
    盡量不要使用startMonitoringSignificantLocationChanges,優(yōu)先考慮startMonitoringForRegion:

  • 硬件檢測優(yōu)化
    用戶移動蟆融、搖晃草巡、傾斜設(shè)備時,會產(chǎn)生動作(motion)事件型酥,這些事件由加速度計山憨、陀螺儀、磁力計等硬件檢測弥喉。在不需要檢測的場合郁竟,應(yīng)該及時關(guān)閉這些硬件

APP的啟動

  • APP的啟動可以分為2種
    冷啟動(Cold Launch):從零開始啟動APP
    熱啟動(Warm Launch):APP已經(jīng)在內(nèi)存中,在后臺存活著由境,再次點擊圖標(biāo)啟動APP

  • APP啟動時間的優(yōu)化棚亩,主要是針對冷啟動進(jìn)行優(yōu)化
    通過添加環(huán)境變量可以打印出APP的啟動時間分析(Edit scheme -> Run -> Arguments)
    DYLD_PRINT_STATISTICS設(shè)置為1
    如果需要更詳細(xì)的信息,那就將DYLD_PRINT_STATISTICS_DETAILS設(shè)置為1

  • APP的冷啟動可以概括為3大階段
    dyld
    runtime
    main


    image.png

APP的啟動 - dyld

  • dyld(dynamic link editor)虏杰,Apple的動態(tài)鏈接器讥蟆,可以用來裝載Mach-O文件(可執(zhí)行文件、動態(tài)庫等)

  • 啟動APP時纺阔,dyld所做的事情有:
    裝載APP的可執(zhí)行文件瘸彤,同時會遞歸加載所有依賴的動態(tài)庫
    當(dāng)dyld把可執(zhí)行文件、動態(tài)庫都裝載完畢后笛钝,會通知Runtime進(jìn)行下一步的處理

APP的啟動 - runtime

  • 啟動APP時质况,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)的初始化(注冊O(shè)bjc類 玻靡、初始化類對象等等)
    調(diào)用C++靜態(tài)初始化器和attribute((constructor))修飾的函數(shù)

到此為止结榄,可執(zhí)行文件和動態(tài)庫中所有的符號(Class,Protocol啃奴,Selector潭陪,IMP,…)都已經(jīng)按格式成功加載到內(nèi)存中,被runtime 所管理

APP的啟動 - main

  • 總結(jié)一下
    APP的啟動由dyld主導(dǎo)依溯,將可執(zhí)行文件加載到內(nèi)存老厌,順便加載所有依賴的動態(tài)庫
    并由runtime負(fù)責(zé)加載成objc定義的結(jié)構(gòu)
    所有初始化工作結(jié)束后,dyld就會調(diào)用main函數(shù)
    接下來就是UIApplicationMain函數(shù)黎炉,AppDelegate的application:didFinishLaunchingWithOptions:方法

APP的啟動優(yōu)化

按照不同的階段

  • dyld
    減少動態(tài)庫枝秤、合并一些動態(tài)庫(定期清理不必要的動態(tài)庫)
    減少Objc類、分類的數(shù)量慷嗜、減少Selector數(shù)量(定期清理不必要的類淀弹、分類)
    減少C++虛函數(shù)數(shù)量
    Swift盡量使用struct

  • runtime
    用+initialize方法和dispatch_once取代所有的attribute((constructor))、C++靜態(tài)構(gòu)造器庆械、ObjC的+load

  • main
    在不影響用戶體驗的前提下薇溃,盡可能將一些操作延遲,不要全部都放在finishLaunching方法中
    按需加載

安裝包瘦身

  • 安裝包(IPA)主要由可執(zhí)行文件缭乘、資源組成
  • 資源(圖片沐序、音頻、視頻等)
  • 采取無損壓縮

  • 去除沒有用到的資源: https://github.com/tinymind/LSUnusedResources

  • 可執(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

  • 利用AppCode(https://www.jetbrains.com/objc/)檢測未使用的代碼:菜單欄 -> Code -> Inspect Code

  • 編寫LLVM插件檢測出重復(fù)代碼、未被調(diào)用的代碼

LinkMap

  • 生成LinkMap文件黍氮,可以查看可執(zhí)行文件的具體組成
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唐含,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滤钱,更是在濱河造成了極大的恐慌觉壶,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件件缸,死亡現(xiàn)場離奇詭異铜靶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)他炊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門争剿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痊末,你說我怎么就攤上這事蚕苇。” “怎么了凿叠?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵涩笤,是天一觀的道長嚼吞。 經(jīng)常有香客問我,道長蹬碧,這世上最難降的妖魔是什么舱禽? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮恩沽,結(jié)果婚禮上誊稚,老公的妹妹穿的比我還像新娘。我一直安慰自己罗心,他們只是感情好里伯,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渤闷,像睡著了一般疾瓮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上飒箭,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天爷贫,我揣著相機(jī)與錄音,去河邊找鬼补憾。 笑死,一個胖子當(dāng)著我的面吹牛卷员,可吹牛的內(nèi)容都是我干的盈匾。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼毕骡,長吁一口氣:“原來是場噩夢啊……” “哼削饵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起未巫,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤窿撬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叙凡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劈伴,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年握爷,在試婚紗的時候發(fā)現(xiàn)自己被綠了跛璧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡新啼,死狀恐怖追城,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情燥撞,我是刑警寧澤座柱,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布迷帜,位于F島的核電站,受9級特大地震影響色洞,放射性物質(zhì)發(fā)生泄漏戏锹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一锋玲、第九天 我趴在偏房一處隱蔽的房頂上張望景用。 院中可真熱鬧,春花似錦惭蹂、人聲如沸伞插。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽媚污。三九已至,卻和暖如春廷雅,著一層夾襖步出監(jiān)牢的瞬間耗美,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工航缀, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留商架,地道東北人。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓芥玉,卻偏偏與公主長得像蛇摸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灿巧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容

  • CPU和GPU 在屏幕成像的過程中赶袄,CPU和GPU起著至關(guān)重要的作用==CPU==(Central Process...
    斑駁的流年無法釋懷閱讀 1,627評論 0 26
  • 好的app應(yīng)該有好的性能流暢度,本篇文章就大概講一下ios性能優(yōu)化抠藕。 先來談?wù)凜PU和GPU 在屏幕成像的過程中饿肺,...
    slimsallen閱讀 1,159評論 0 3
  • 隨著項目功能的不斷增加和擴(kuò)展,如果你的代碼沒有經(jīng)過嚴(yán)格的調(diào)試和優(yōu)化,我相信你的app一定出現(xiàn)過一些卡頓現(xiàn)象要么就是...
    Jack_Baiyx閱讀 666評論 0 0
  • 一、卡頓優(yōu)化 在屏幕成像的過程中盾似,CPU和GPU起著至關(guān)重要的作用敬辣。CPU(Central Processing ...
    伶俐ll閱讀 814評論 0 1
  • 當(dāng)總是回憶起一個人時 我們要對這個人說 我想你了 當(dāng)總是夢見一個人時 我們要對這個人說 我想你了 當(dāng)總是想看見一個...
    冷冷的孤獨閱讀 211評論 0 2