iOS-UITableView的最佳化(純手打原創),iosuitableview最佳化
TableView的最佳化一:什麼是TableView的最佳化以及為什麼要最佳化
1)CPU(中央處理器)和GPU(圖形處理器) CPU主要從事邏輯計算的一些工作 GPU主要從事圖形處理方面的工作
2)CPU和GPU的共同點:
都有自己的緩衝體系 都有自己的數字和邏輯運算單元 都為了完成計算任務而設計
3)CPU和GPU的不同點:
CPU的核少但是核內空間非常大 能夠處理複雜的邏輯
GPU核多但是每個核的空間相對較小 故而處理複雜邏輯的空間較少
針對CPU和GPU的上述不同,面對一個程式系統分配給CPU的往往是較為複雜的邏輯運算,分配給GPU的通常是圖片等控制項的操作
4)上述不同而導致的結果
當程式員為CPU編程時,傾向於用複雜的邏輯結構最佳化演算法來減少計算任務的時間 Latency
為GPU編程->利用其能夠處理海量資料的優勢,來提高總的資料的輸送量 來掩蓋Latency
5)為什麼最佳化
學術上:平衡CPU和GPU在工作上的壓力,從而正確的使用CPU和GPU的資源,使他們均勻的負載 這樣子使得FPS保持在60幀左右,最終使得使用者體驗更加美好
非學術上:掌握UITableView能夠給面試加分
二:UITableView的工作原理
1)tablewView代理方法的執行順序
UITableView返回多少組----->每組返回多少行cell--->計算每個cell的高度---->指定cell(cell布局)
2)cell的複用
原理:當滾動列表時(UITableView)部分cell會移除Window 但是移除的cell並沒有被立即釋放 而是放到了一個叫做複用池的對象池中,處於待定狀態,當有新的cell要出現在Window介面上時,首先會從複用池中尋找是否有相同類型的cell,如果有直接拿過用(最直觀的表現是新出現的cell有沒有開闢新的記憶體空間),如果沒有,建立一個新的類型的cell,所以UITableView可能擁有多種類型的cell,複用池也可能儲存著多種類型的cell,系統通過定義reuseIndentifer作為每個cell的唯一標示符來確定即將出現的cell複用何種類型的cell
三:UITableView的具體最佳化
1)盡量使用cell的複用
使用cell的複用,可以減少記憶體的開銷,沒有開闢新的空間,也減少了一些計算量
2)對於不定高的cell 提前將每個cell的高度存入數組,出現一個cell的時候,直接從數組中拿出確切的高度即可,不用臨時計算cell的高度
圖文混排、評論
對於固定高的cell和不定高的cell同樣適用
3)涉及網路請求載入資料在UITableView滑動結束的時候在進行載入資料(渲染)避免卡頓
1.UITableView繼承自UIScrollView,繼承了後者的方法
//滑動結束的方法
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
//減速結束之後的方法
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
2.if(self.tableView.dragging==NO&&self.tableView.decelerating==NO)在tableView必須實現的二個方法中(載入cell的方法中)將資料的渲染寫在上述if語句中
4)對於tableView的自訂控制項 尤其是UIImageView,盡量減少使用圓角,陰影等layer屬性,盡量減少使用alpha(透明度)來設定透明度,(在項目開發中,讓UI設計師設計原圖就是帶圓角的圖) 陰影,圓角這些layer效果都是在GPU中完成的
1.當多個視圖重疊時,GPU會進行合成渲染,而渲染的最慢的操作就是混合,因此當視圖結構太過複雜,就會大量消耗GPU的資源,所以當一個空間本身是不透明,注意設定alpha為1,這樣可以避免無用的alpha通道合成,降低GPU的負載
2.對控制項設定cornerRadius後對其進行clip或mask操作時 會導致offscreenrendering這個也是在GPU中進行的 如果在滑動時 圓角對象太多 回到GPU的負載大增幅
這時我們可以設定layer的shouldRasterize屬性為YES,可以將負載轉移給CPU 更徹底的是直接使用帶圓角的原圖
5)盡量使用懶載入
又稱為消極式載入 實際上是重寫某個對象的getter方法 原理:程式一開始並不對它進行初始化 而是在用到他的時候 才為他開闢記憶體供它使用
好處:
1.不必將建立的對象的代碼全部寫在ViewDidLoad中,代碼可讀性強
2.每個控制項的getter方法,分別負責各自的執行個體化處理,代碼彼此之間獨立性強 松耦合
6)減少返回給的cell裡面的處理邏輯和處理時間
驢媽媽為例:各個UI控制項整合到一起 實際上只有一個控制項
7)設定每個cell的opaque屬性 ----面試亮點
opaque意思是不透明的 渾濁的 有YES和NO二個結果
alpha 透明度
如果控制項本身不透明,我們設定opaque為YES
8)分段載入資料
設定分頁載入資料 也就是上拉重新整理和下拉載入