source: https://juejin.im/post/5b7a9c466fb9a019eb43b0d5
卡頓優化 -CPU
在OpenGL中,GPU有2種渲染方式
離屏渲染消耗性能的原因
哪些操作會觸發離屏渲染?
卡頓優化 -CPU
- 盡量用輕量級的對象,比如用不到事件處理的地方,可以考慮使用CALayer取代UIView 不要頻繁地調用UIView的相關屬性,比如frame、bounds、transform等屬性,盡量減少不必要的修改
- 盡量提前計算好佈局,在有需要時一次性調整對應的屬性,不要多次修改屬性
- Autolayout會比直接設置frame消耗更多的CPU資源
- 圖片的size最好剛好跟UIImageView的size保持一致
- 控制一下線程的最大並發數量
- 盡量把耗時的操作放到子線程
- 盡量避免短時間內大量圖片的顯示,盡可能將多張圖片合成一張進行顯示
- 盡量減少視圖數量和層次
- 減少透明的視圖(alpha<1 li="" nbsp="" opaque="">
- 盡量避免出現離屏渲染
在OpenGL中,GPU有2種渲染方式
- On-Screen Rendering:當前屏幕渲染,在當前用於顯示的屏幕緩衝區進行渲染操作
- Off-Screen Rendering:離屏渲染,在當前屏幕緩衝區以外新開闢一個緩衝區進行渲染操作
離屏渲染消耗性能的原因
- 需要創建新的緩衝區
- 離屏渲染的整個過程,需要多次切換上下文環境,先是從當前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結束以後,將離屏緩衝區的渲染結果顯示到屏幕上,又需要將上下文環境從離屏切換到當前屏幕
哪些操作會觸發離屏渲染?
- 光柵化,layer.shouldRasterize = YES
- 遮罩,layer.mask
- 圓角,同時設置layer.masksToBounds = YES、layer.cornerRadius大於0 考慮通過CoreGraphics繪製裁剪圓角,或者叫美工提供圓角圖片
- 陰影,layer.shadowXXX 如果設置了layer.shadowPath就不會產生離屏渲染
優化方案
一、dyld
- 減少動態庫、合併一些動態庫(定期清理不必要的動態庫)
- 減少Objc類、
- 分類的數量、
- 減少Selector數量(定期清理不必要的類、分類)
- 減少C++虛函數數量
- Swift盡量使用struct
- 用+initialize方法和dispatch_once取代所有的__attribute__((constructor))、C++靜態構造器、ObjC的+load
- 在不影響用戶體驗的前提下,盡可能將一些操作延遲,不要全部都放在finishLaunching方法中 按需加載
留言