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