一、iOS頁面UI渲染其實是由CPU和GPU同時協(xié)作完成的裆站。
CPU工作是進行UI計算烂瘫,文本處理,圖片轉(zhuǎn)碼等操作帽哑;GPU接著做下面的工作渲染管線用OPENGL渲染到當前頁面視圖上谜酒;在iOS設(shè)備時鐘周期內(nèi)完成計算和渲染。
iOS設(shè)備的硬件時鐘周期是每秒60妻枕,即要求開發(fā)中每一幀的UI繪制不超過1s/60僻族,一旦超過這個時間粘驰,即UI繪制顯示延遲,滑動頁面時就會給我們卡頓的感覺述么。
了解了上面的概念蝌数,我們應(yīng)該能想到一些針對開發(fā)中遇到的卡頓優(yōu)化措施
基于CPU的優(yōu)化,把如下耗時操作在子線程中進行度秘,避免在主線程中造成滾動中UI渲染CPU的延遲:
布局計算顶伞,高度緩存,文字計算剑梳,圖片的解碼唆貌,文本的預(yù)繪制,對象的創(chuàng)建垢乙、修改挠锥,銷毀等。
基于GPU的優(yōu)化侨赡,盡量少用離屏渲染,盡量少對view設(shè)置透明度操作粱侣,盡量減少view層次結(jié)構(gòu)羊壹,盡量少用圖層混合,是否圖片大小不合適等方面
二齐婴、順便查了下屏幕渲染油猫,分為三種
1、離屏渲染(Off-Screen Rendering):就是GPU在當前屏幕以外開辟一個另外的緩沖區(qū)進行渲染操作柠偶。
2情妖、當前屏幕渲染(On-Screen Rendering):指的是GPU是在當前顯示的屏幕緩沖區(qū)進行的渲染操作。
3诱担、CPU的離屏渲染:即非GPU渲染毡证,如果重寫了drawReact,并且使用Core Graphics技術(shù)進行了繪制操作蔫仙,就涉及到了這個技術(shù)料睛,整個過程由CPU在APP中同步完成,渲染得到bitmap后再交給GPU進行渲染顯示摇邦。
為什么離屏渲染會耗性能恤煞?當使用遮罩,圓角施籍,陰影的時候居扒,圖層屬性的混合體被指定為在預(yù)合成之前是不能直接在屏幕中進行繪制的,所以就需要屏幕外渲染被喚起丑慎,就意味著圖層在顯示之前必須在一個屏幕外的上下文中被渲染喜喂,而這個屏幕外渲染緩沖區(qū)上下文和當前屏幕渲染緩沖區(qū)上下文之間的切換非常耗性能瓤摧。
離屏渲染可以在Instruments的Core Animation工具中有幾個和離屏渲染相關(guān)的檢查選項:
? · ? Color Offscreen-Rendered Yellow
開啟后會把那些需要離屏渲染的圖層高亮成黃色,這就意味著黃色圖層可能存在性能問題夜惭。
? · ? Color Hits Green and Misses Red
三姻灶、渲染抉擇
能用當前屏幕渲染就用當前屏幕渲染,不得已使用離屏渲染的時候诈茧,需要明白CPU的浮點運算能力是不如GPU的产喉,但是如果是比較簡單的效果實現(xiàn),CPU離屏渲染確是比較好的選擇敢会,畢竟屏幕緩沖區(qū)的上下文切換是非常耗性能的曾沈。