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)分段加載數據
?
設置分頁加載數據,也就是上拉刷新和下拉加載。
?
轉載于:https://www.cnblogs.com/fengmin/p/5497082.html
總結
以上是生活随笔為你收集整理的TableView的优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cocos2d-3.x目录介绍分析
- 下一篇: 晚上做梦梦到一个人是什么原因