iOS性能優化 - 卡頓優化

成像過程:

  • 在iOS中是雙緩衝機制,有前幀緩存、後幀緩存

成像原理:

  • 發出垂直同步信號,告訴屏幕即將顯示一幀數據;
  • 發出水平同步信號,顯示一行一行的數據,直到填充到整個屏幕爲止。

產生卡頓的緣由

  • 如圖:垂直同步信號的發射頻率是固定的,信號發出,表明着即將顯示數據;
  • 若是期間,CPU或GPU有一步耗時較長(第3幀的渲染),垂直信號已發出,可是GPU尚未渲染完,那麼就是顯示渲染好的第2幀數據,連續顯示相同的幀,就形成了畫面卡頓。
  • 第3幀會在第4次同步信號過來時再顯示。

因此解決卡頓的主要思路:

  • 儘量減小CPU、GPU的資源消耗。(保證刷幀率60FPS.)

CPU優化:

  • 儘可能用輕量級的對象,好比用不到事件處理的地方,能夠考慮使用CALayer取代UIView;git

  • 不要頻繁地調用UIView的相關屬性,好比frame、bounds、transform等屬性,儘可能減小沒必要要的修改;github

  • 儘可能提早計算好佈局,在有須要時一次性調整對應的屬性,不要屢次修改屬性;緩存

  • Autolayout會比直接設置frame消耗更多的CPU資源;性能優化

  • 圖片的size最好恰好跟UIImageView的size保持一致;bash

  • 控制一下線程的最大併發數量;併發

  • 儘可能把耗時的操做放到子線程:oop

    1. 圖片處理(解碼、繪製);
    2. 文本處理(尺寸計算、繪製):
// 文字計算
    [@"text" boundingRectWithSize:CGSizeMake(100, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:nil context:nil];
    
    // 文字繪製
    [@"text" drawWithRect:CGRectMake(0, 0, 100, 100) options:NSStringDrawingUsesLineFragmentOrigin attributes:nil context:nil];
複製代碼

GPU優化:

  • 儘可能避免短期內大量圖片的顯示,儘量將多張圖片合成一張進行顯示;佈局

  • GPU能處理的最大紋理尺寸是4096x4096,一旦超過這個尺寸,就會佔用CPU資源進行處理,因此紋理儘可能不要超過這個尺寸;post

  • 儘可能減小視圖數量和層次;性能

  • 減小透明的視圖(alpha<1),不透明的就設置opaque爲YES;

  • 儘可能避免出現離屏渲。


卡頓檢測

思路:

  • 平時所說的「卡頓」主要是由於在主線程執行了比較耗時的操做;

  • 能夠添加Observer到主線程RunLoop中,經過監聽RunLoop狀態切換的耗時,以達到監控卡頓的目的。

  • 第三方:LXDAppMonitor


iOS性能優化:

相關文章
相關標籤/搜索