iOS如何提高頁面流暢度

來源:互聯網
上載者:User

標籤:資料   滑動   sharp   coretext   sha   graph   圓角   修改   ...   

A.提高CPU效能

對象建立
1.盡量用輕量的對象代替重量的對象,比如CALayer 比 UIView 要輕量許多,如果不考慮互動事件的話,可以選擇CALayer。
2.Storyboard和xib載入對象時,消耗的成本比代碼多。在使用時需要綜合考慮。
3.使用對象的預先載入和懶載入,減少使用時載入的負擔。

對象調整
1.UIView 的關於顯示相關的屬性(比如 frame/bounds/transform)等實際上都是 CALayer 屬性對應來的,所以對 UIView 的這些屬性進行調整時,消耗的資源要遠大於一般的屬性。不用頻繁修改。
2.UIView和CALayer層次的修改會激發很多代理和通知,盡量少去調整層次。

對象的消耗
1.對象容器型對象的消耗需要重視,盡量放到後台進行銷毀。
Tip:
NSArray *tmp = self.array;
self.array = nil;
dispatch_async(queue, ^{
[tmp class];
});

布局計算
1.app內視圖計算通常比較銷毀CPU效能,而且算出的結果通常是修改uiview的frame相關屬性,更是消耗cpu效能,所以盡量避免頻繁的布局更新

Autolayout
1.自動布局對cpu的消耗隨著複雜度是呈指數級的,故慎用

文本計算
1.頁面的文本計算一般是無法避免的,自己手動計算可以提高效能

文本渲染
1.常見的文本控制項 (UILabel、UITextView 等),其排版和繪製都是在主線程進行的,當顯示大量文本時,CPU 的壓力會非常大。
對此解決方案只有一個,那就是自訂文本控制項,用 TextKit 或最底層的 CoreText 對文本非同步繪製。

圖片解碼
當用 UIImage 或 CGImageSource 的那幾個方法建立圖片時,產生的對象不會立即解碼,而是當圖片設定到 UIImageView 或者 CALayer.contents 中去,並且 CALayer 被提交到 GPU 前,CGImage 中的資料才會得到解碼。解碼都是在主線程中,影響效能。
常見的做法是在後台線程先把圖片繪製到 CGBitmapContext 中,然後從 Bitmap 直接建立圖片。目前常見的網狀圖片庫都內建這個功能。

映像繪製
1.映像的繪製通常是指用那些以 CG 開頭的方法把映像繪製到畫布中,然後從畫布建立圖片並顯示這樣一個過程。這個最常見的地方就是 [UIView drawRect:] 裡面了。由於 CoreGraphic 方法通常都是安全執行緒的,所以映像的繪製可以很容易的放到後台線程進行。一個簡單非同步繪製的過程大致如下(實際情況會比這個複雜得多,但原理基本一致):
- (void)display {
dispatch_async(backgroundQueue, ^{
CGContextRef ctx = CGBitmapContextCreate(...);
// draw in context...
CGImageRef img = CGBitmapContextCreateImage(ctx);
CFRelease(ctx);
dispatch_async(mainQueue, ^{
layer.contents = img;
});
});
}

B.提高GPU效能
紋理渲染
1.當在較短時間顯示大量圖片時(比如 TableView 存在非常多的圖片並且快速滑動時),CPU 佔用率很低,GPU 佔用非常高。避免這種情況的方法只能是盡量減少在短時間內大量圖片的顯示,儘可能將多張圖片合成為一張進行顯示。
2.當圖片過大,超過 GPU 的最大紋理尺寸時,圖片需要先由 CPU 進行預先處理,這對 CPU 和 GPU 都會帶來額外的資源消耗。目前來說,iPhone 4S 以上機型,紋理尺寸上限都是 4096×4096。所以,盡量不要讓圖片和視圖的大小超過這個值。

視圖混合
1.當多個視圖或者CALayer混合顯示時,GPU會將它們混合到一起,如果視圖多,結構複雜就會增加混合難度。解決方案:減少視圖個數和層次,在不透明的視圖中標明opaque 屬性以避免無用的 Alpha 通道合成。或者把它們合成到一張大圖上。

圖形產生
1.CALayer 的 border、圓角、陰影、遮罩(mask),CASharpLayer 的向量圖形顯示,通常會觸發離屏渲染(offscreen rendering),而離屏渲染通常發生在 GPU 中。當一個列表視圖中出現大量圓角的 CALayer,並且快速滑動時,可以觀察到 GPU 資源已經佔滿,而 CPU 資源消耗很少。
為了避免這種情況,可以嘗試開啟 CALayer.shouldRasterize 屬性,但這會把原本離屏渲染的操作轉嫁到 CPU 上去。另外解決方案是把需要顯示的圖形在後台線程繪製為圖片,避免使用圓角、陰影、遮罩等屬性。


非同步渲染架構
AsyncDisplayKit,提高頁面的流暢度

 

 

參考文章:iOS 保持介面流暢的技巧 https://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

iOS如何提高頁面流暢度

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.