一:針對CPU
1.文本的計算放到分線程敏释,Coretext或Textkit進行相關(guān)繪制
2.圖片解碼放到子線程
3.圓角重新子線程繪制一張圖片
4..避免 對象創(chuàng)建囱修,對象銷毀卦方,對象調(diào)整纪吮,盡量少用addView給Cell動態(tài)添加View,可以初始化時就添加,然后通過hide來控制是否顯示
5.減少subviews的數(shù)量
6.避免重復(fù)計算要糊,比如 緩存高度纲熏,只計算一次,根據(jù)數(shù)據(jù)源計算出對應(yīng)的布局锄俄,并緩存到數(shù)據(jù)源中(ps:如果現(xiàn)在要顯示100個Cell局劲,當(dāng)前屏幕顯示5個。那么刷新(reload)UITableView時奶赠,UITableView會先調(diào)用100次
tableView:heightForRowAtIndexPath:
方法鱼填,然后調(diào)用5次
tableView:cellForRowAtIndexPath:
方法;滾動屏幕時毅戈,每當(dāng)Cell滾入屏幕苹丸,都會調(diào)用一次
tableView:heightForRowAtIndexPath:
tableView:cellForRowAtIndexPath:
二:針對GPU
-
多視圖混合情況
(1)背景不透明塑猖,盡量少用或不用透明圖層:確保控件的opaque屬性設(shè)置為true谈跛,確保backgroundColor和父視圖顏色一致且不透明如無特殊需要,不要設(shè)置低于1的alpha值
(2)確保UIImage沒有alpha通道
2.圖片相關(guān)
(1)確保圖片大小和frame一致塑陵,保證字節(jié)對齊感憾,不要在滑動時縮放圖片,縮放消耗時間
(2)圖片格式png:確保圖片顏色格式被GPU支持令花,避免勞煩CPU轉(zhuǎn)換
3.字節(jié)對齊
Core Animation在圖像數(shù)據(jù)非字節(jié)對齊的情況下渲染前會先拷貝一份圖像數(shù)據(jù)阻桅,
32位對應(yīng)rgb和alpha,字節(jié)對齊不進行額外計算 像素不對齊:會繼續(xù)合成紋理兼都,消耗資源
4.慎用離屏渲染
絕大多數(shù)時候離屏渲染會影響性能 ,盡量其它方法實現(xiàn)
設(shè)置圓角嫂沉、陰影、模糊效果扮碧,光柵化都會導(dǎo)致離屏渲染
設(shè)置陰影效果是加上陰影路徑
滑動時若需要圓角效果趟章,開啟光柵化
三:解碼圖像
一般我們使用的圖像是JPG/PNG,這些圖像數(shù)據(jù)不是位圖慎王,而是是經(jīng)過編碼壓縮后的數(shù)據(jù)蚓土,使用它渲染到屏幕之前需要進行解碼轉(zhuǎn)成位圖數(shù)據(jù),這個解碼操作是比較耗時的赖淤,并且沒有GPU硬解碼蜀漆,只能通過CPU,iOS默認(rèn)會在主線程對圖像進行解碼咱旱。很多庫都解決了圖像解碼的問題确丢,不過由于解碼后的圖像太大,一般不會緩存到磁盤吐限,SDWebImage的做法是把解碼操作從主線程移到子線程鲜侥,讓耗時的解碼操作不占用主線程的時間。
四:內(nèi)存映射
平常我們讀取磁盤上的一個文件毯盈,上層API調(diào)用到最后會使用系統(tǒng)方法read()讀取數(shù)據(jù)剃毒,內(nèi)核把磁盤數(shù)據(jù)讀入內(nèi)核緩沖區(qū),用戶再從內(nèi)核緩沖區(qū)讀取數(shù)據(jù)復(fù)制到用戶內(nèi)存空間搂赋,這里有一次內(nèi)存拷貝的時間消耗赘阀,并且讀取后整個文件數(shù)據(jù)就已經(jīng)存在于用戶內(nèi)存中,占用了進程的內(nèi)存空間脑奠。