精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS 視圖,動畫渲染機制探究

移動開發
終端的開發,首當其沖的就是視圖、動畫的渲染,切換等等。用戶使用 App 時最直接的體驗就是這個界面好不好看,動畫炫不炫,滑動流不流暢。UI就是 App 的門面,它的體驗伴隨著用戶使用 App 的整個過程。如果UI失敗,用戶是不會有打開第二次的欲望的。

終端的開發,首當其沖的就是視圖、動畫的渲染,切換等等。用戶使用 App 時最直接的體驗就是這個界面好不好看,動畫炫不炫,滑動流不流暢。UI就是 App 的門面,它的體驗伴隨著用戶使用 App 的整個過程。如果UI失敗,用戶是不會有打開第二次的欲望的。

iOS 為開發者提供了豐富的 Framework(UIKit,Core Animation,Core Graphic,OpenGL 等等)來滿足開發從上層到底層各種各樣的需求。不得不說蘋果很牛逼,很多接口你根本不需要理解背后的原理就能上手使用并且滿足你大部分的需求,但是,如果遇到性能問題就容易抓瞎。易用性跟優化就是個矛盾體,就像 ARC 一樣,當你沒有遇到內存問題的時候用得很爽,一旦遇到了,就要要求你比在用 MRC 的時候更加了解 iOS 的內存機制。UI 亦是如此。況且,作為鵝廠的員工當然不能僅限于知道怎么用。我們要知其然還要知其所以然。好了,廢話不說,我們進入主題:看看 iOS 是如何渲染視圖和動畫的,以及在我們遇到渲染的性能問題時怎么做優化。

(注意:以下內容是筆者的一些踩坑經驗和總結, 歡迎探討!)

先來看看官方對 Core Animation 的一段說明:

以看出iOS渲染視圖的核心是 Core Animation。從底層到上層依此是 GPU->(OpenGL、Core Graphic) -> Core Animation -> UIKit。

在 iOS上,動畫和視圖的渲染其實是在另外一個進程做的(下面我們叫這個進程 render server),在 iOS 5 以前這個進程叫 SpringBoard,在 iOS 6 之后叫 BackBoard。

下面這幅圖是使用項目錄制視頻的時候(大量視圖渲染),整個系統的進程情況:

可以很清楚地看到 BackBoard 這個進程的情況。

iOS 上視圖或者動畫渲染的各個階段:

在 APP 內部的有4個階段:

  • 布局:在這個階段,程序設置 View/Layer 的層級信息,設置 layer 的屬性,如 frame,background color 等等。
  • 創建 backing image:在這個階段程序會創建 layer 的 backing image,無論是通過 setContents 將一個 image 傳給 layer,還是通過 drawRect:或 drawLayer:inContext:來畫出來的。所以 drawRect:等函數是在這個階段被調用的。
  • 準備:在這個階段,Core Animation 框架準備要渲染的 layer 的各種屬性數據,以及要做的動畫的參數,準備傳遞給 render server。同時在這個階段也會解壓要渲染的 image。(除了用 imageNamed:方法從 bundle 加載的 image 會立刻解壓之外,其他的比如直接從硬盤讀入,或者從網絡上下載的 image 不會立刻解壓,只有在真正要渲染的時候才會解壓)。
  • 提交:在這個階段,Core Animation 打包 layer 的信息以及需要做的動畫的參數,通過 IPC(inter-Process Communication)傳遞給 render server。

在 APP 外部的2個階段:

當這些數據到達 render server 后,會被反序列化成 render tree。然后 render server 會做下面的兩件事:

  • 根據 layer 的各種屬性(如果是動畫的,會計算動畫 layer 的屬性的中間值),用 OpenGL 準備渲染。
  • 渲染這些可視的 layer 到屏幕。

如果做動畫的話,最后的兩個步驟會一直重復知道動畫結束。

我們都知道 iOS 設備的屏幕刷新頻率是 60HZ。如果上面的這些步驟在一個刷新周期之內無法做完(1/60s),就會造成掉幀。

我們看看有哪些操作可能會過度消耗 CPU 或者 GPU,從而造成掉幀。

  • 視圖上有太多的 layer 或者幾何形狀:
    如果視圖的層級結構太復雜的話,當某些視圖被渲染或者 frame 被修改的話,CPU 會花比較多得時間去重新計算 frame。尤其如果用 autolayout 的話,會更消耗 CPU。同時過多的幾何結構會大大增多需要渲染的 OpenGLl triangles 以及柵格化的操作(將 OpenGL 的 triangles 轉化成像素)

  • 太多的 overdraw:overdraw 是指一個像素點被多次地用顏色填充。這個主要是由于一些半透明的 layer 相互重疊造成的。GPU 的 fill-rate(用顏色填充像素的速率)是有限的。如果 overdraw 太多的話,勢必會降低 GPU 的性能。

  • 視圖的延后載入:
    iOS 只有在展示 viewcontroller 的 view 或者訪問 viewcontroller 的 view,比如說 someviewcontroller.view 的時候才會加載view。如果在用戶點擊了某個 button,并且在 button 的響應函數里做了很多消耗 cpu 的工作,這個時候如果 present 某個 viewcontroller 的話,會容易卡頓,尤其是如果 viewcontroller 要從 database 里獲取數據,或者從 nib 文件初始化 view 或者加載圖片會更卡。

  • 離屏的繪制:離屏的繪制有兩種情況:1. 有些效果(如 rounded corners,layer masks,drop shadows 和 layer rasterization)不能直接的繪制到屏幕上,必須先繪制到一個 offscreen 的 image context 上,這種操作會引入額外的內存和 CPU 消耗。2. 實現了 drawRect 或者 drawLayer:inContext:,為了支持任意的繪制,core graphic 會創建一個大小跟要畫的 view 一樣的 backing image。并且當畫完的以后要傳輸到 render server 上渲染。所以沒事不要重載 drawRect 等函數卻什么都不做。

  • 圖片解壓:用 imageNamed:從 bundle 里加載會立馬解壓。一般的情況是在賦值給 UIImageView 的 image 或者 layer 的 contents 或者畫到一個 core graphic context 里才會解壓。

渲染性能優化的注意點:

隱藏的繪制:catextlayer 和 uilabel 都是將 text 畫入 backing image 的。如果改了一個包含 text 的 view 的 frame 的話,text 會被重新繪制。

Rasterize:當使用 layer 的 shouldRasterize 的時候(記得設置適當的 laye r的 rasterizationScale),layer 會被強制繪制到一個 offscreen image 上,并且會被緩存起來。這種方法可以用來緩存繪制耗時(比如有比較絢的效果)但是不經常改的 layer,如果 layer 經常變,就不適合用。

離屏繪制: 使用 Rounded corner, layer masks, drop shadows 的效果可以使用 stretchable images。比如實現 rounded corner,可以將一個圓形的圖片賦值于 layer 的 content 的屬性。并且設置好 contentsCenter 和 contentScale 屬性。

Blending and Overdraw :如果一個 layer 被另一個 layer 完全遮蓋,GPU 會做優化不渲染被遮蓋的 layer,但是計算一個 layer 是否被另一個 layer 完全遮蓋是很耗 cpu 的。將幾個半透明的 layer 的 color 融合在一起也是很消耗的。

我們要做的:

  1. 設置 view 的 backgroundColor 為一個固定的,不透明的 color。

  2. 如果一個 view 是不透明的,設置 opaque 屬性為 YES。(直接告訴程序這個是不透明的,而不是讓程序去計算)

這樣會減少 blending 和 overdraw。

如果使用 image 的話,盡量避免設置 image 的 alpha 為透明的,如果一些效果需要幾個圖片融合而成,就讓設計用一張圖畫好,不要讓程序在運行的時候去動態的融合。

好了,介紹完這些渲染優化需要注意的點,讓我們用 instrument 的 Core Animation 和 GPU driver 來看看一些具體的例子。

Core Animation:

  • Color Blended Layers:看半透明 layer 的遮蓋情況。從綠到紅,越紅遮蓋越大。

這下這兩幅圖是測量項目詳情頁的半透明的layer的情況。可以看到詳情頁這里半透明的layer還是比較多的,但不是說半透明的layer很多,范圍很大就要優化,要參看GPU driver的測量情況看,下面會介紹

Color Hits Green and Misses Red:當使用shouldRasterize的時候,layer drawing 會被緩存起來,如果 rasterized 的 layer 需要被重新繪制,會標示紅。

下面是全民K歌消息列表的 cell 設置 shouldRasterize=YES 的情況,每個 cell 的 layer 的 backing image 會被緩存起來,如果往下滾動 tableview 的話,由于 cell 會被復用,這樣 layer 就會被重繪,會被標紅。

Color Offscreen-Rendered Yellow:如果要做 offscreen drawing 的話,會標成黃色。

下面是項目的首頁,由于圓形頭像的實現方式是設置 roundedCorner 的屬性來實現,所以會觸發 offscreen drawing。

Core Animation template 只是能讓開發者直觀地看到哪些地方有可能需要優化,但是到底要不要優化,還是要看 GPU driver 的表現。

GPU Driver

Renderer Utilization ——如果這個值大于50%的話,表示 GPU 的性能受到 fill-rate 的限制,可能有太多的 Offscreen rendering,overdraw,blending。

Tiler Utilization ——如果這個值大于50%,表示可能有太多的 layers。

我們以上面的那個項目的詳情頁為例,看看 GPU driver 的測量:

可以看到這 Renderer Utilization 是20%左右,Tiler Utilization 時15%,可以不用優化,(當然這里我們先不考慮 CPU 的使用情況,只是單單針對上面 core animation template 的一些測量說不用做針對性的優化)

這里想說的一點是,以上所說的點只是在我們遇到渲染性能問題的時候給我們提供優化的方向跟思路。優化往往代表著更復雜,難懂的代碼,在沒有遇到渲染性能問題的時候不要過度優化。

希望對大家有幫助!

責任編輯:倪明 來源: 騰訊Bugly
相關推薦

2015-12-30 14:16:05

iOS動畫視圖渲染

2025-01-02 14:50:34

MyBatis開發緩存

2009-02-03 14:00:20

PHP運行PHP調用PHP原理

2017-06-09 11:00:42

前端DOMElement

2017-04-12 11:46:46

前端瀏覽器渲染機制

2013-06-04 15:41:31

iOS開發移動開發block

2017-02-15 09:25:36

iOS開發MQTT

2012-12-24 13:38:01

iOSUIView

2010-08-13 11:21:31

Flex渲染器

2017-05-03 17:00:16

Android渲染機制

2023-06-27 08:37:35

Java反射動態代理機制

2025-06-23 00:03:00

2021-12-01 18:36:35

屬性

2013-03-29 11:06:24

iOS開發滾動視圖UIScrol

2011-07-03 10:05:52

Core Animat

2024-01-15 09:23:16

框架方式原生

2021-12-06 14:52:08

動畫Android補間動畫

2018-05-27 17:44:53

私有庫索引庫倉庫

2024-08-28 08:00:00

2013-06-14 13:50:28

iOS開發移動開發警告視圖
點贊
收藏

51CTO技術棧公眾號

久久精品日产第一区二区| 天天躁日日躁成人字幕aⅴ| 一区二区三区.www| 国产一区二区黄色| 日本一区二区三区久久| 欧美激情aⅴ一区二区三区| 亚洲国产欧美久久| 污视频网站观看| 成人影院在线视频| 中文在线资源观看网站视频免费不卡| 亚洲一区二区三区毛片| 亚洲视频 欧美视频| 中文字幕亚洲精品乱码| 亚洲欧美国产另类| 国产在线视频三区| 国产另类xxxxhd高清| 一区二区三区资源| 一本久久a久久精品vr综合| 五月天久久久久久| 国产美女娇喘av呻吟久久| 日韩免费av一区二区| 清纯粉嫩极品夜夜嗨av| 日韩av有码| 亚洲精品成a人在线观看| 波多野结衣天堂| 国产ktv在线视频| 亚洲人成电影网站色mp4| 欧洲精品久久| 色视频在线观看免费| 国产精品18久久久久久久网站| 国产精品久久久av久久久| 日韩欧美三级在线观看| 欧美精品二区| 久久色免费在线视频| 日韩女同一区二区三区| 妖精视频一区二区三区免费观看| 日韩精品专区在线| 亚欧精品在线视频| 欧美v亚洲v综合v国产v仙踪林| 日韩欧中文字幕| 自拍日韩亚洲一区在线| 国产羞羞视频在线播放| 亚洲摸摸操操av| 一区二区三区欧美成人| 91社区在线| 国产女主播在线一区二区| 久久久久久九九九九| 日本高清视频免费看| 丁香婷婷深情五月亚洲| av噜噜色噜噜久久| 男人天堂av网| 成人爽a毛片一区二区免费| 91在线短视频| 亚洲a视频在线| 国产精品一二三在| 97av自拍| 天堂国产一区二区三区| 99精品视频在线播放观看| 精品在线一区| 韩日视频在线| 国产精品毛片大码女人| 亚洲一区二区三区加勒比| 日本天堂在线观看| 中文字幕在线不卡一区| 欧美精品一区二区性色a+v| 中文在线手机av| 亚洲国产wwwccc36天堂| 玩弄中年熟妇正在播放| 三上悠亚国产精品一区二区三区| 欧洲一区二区三区在线| 亚洲精品成人在线播放| 亚洲一区网址| 日韩av在线播放资源| 人与嘼交av免费| 99久久久久国产精品| 九九热精品视频国产| 日本一级黄色大片| 久久精品毛片| 91精品视频在线看| 噜噜噜久久,亚洲精品国产品| 91污片在线观看| 先锋影音欧美| 欧美亚洲系列| 色老综合老女人久久久| 欧美性受xxxxxx黑人xyx性爽| 亚洲精品观看| 亚洲日本aⅴ片在线观看香蕉| 99鲁鲁精品一区二区三区| 在线精品在线| 国产精品男人的天堂| www国产一区| 久久久蜜桃精品| 日本黄网站色大片免费观看| 国产在线精彩视频| 欧美精品自拍偷拍| 熟妇人妻久久中文字幕| 久久在线免费| 3344国产精品免费看| 国产一区二区在线视频观看| 成人黄色大片在线观看 | 欧美极品美女电影一区| 国产婷婷色一区二区在线观看| 国产最新精品免费| 精品一区二区三区免费毛片| 免费大片黄在线观看视频网站| 红桃av永久久久| 九九九九九国产| 亚洲人亚洲人色久| 欧美夫妻性生活视频| 成人小视频在线播放| 成人成人成人在线视频| 亚洲精品永久www嫩草| 中老年在线免费视频| 欧美一区二区三区白人| 日本一二三不卡视频| 亚洲免费成人| 99九九电视剧免费观看| 丝袜美腿美女被狂躁在线观看| 精品国产成人av| 黑人巨大猛交丰满少妇| 91亚洲自偷观看高清| 欧洲精品久久久| 人妻与黑人一区二区三区| 亚洲三级在线看| 午夜激情av在线| 国内精品视频在线观看| 777精品视频| 国产成人手机在线| 玉米视频成人免费看| 日韩av在线中文| 成人婷婷网色偷偷亚洲男人的天堂| 97超级碰碰人国产在线观看| 亚洲精品成人区在线观看| 亚洲欧美影音先锋| 天天干天天爽天天射| 欧美一区二区三| 国产成人涩涩涩视频在线观看| 色香蕉在线视频| 香港成人在线视频| 四虎国产精品免费| 欧美精品一级| 电影午夜精品一区二区三区| 日本精品600av| 日韩精品一区国产麻豆| 欧美成人一二三区| 国产99久久久国产精品| 精品一区二区三区无码视频| 2023国产精华国产精品| 欧美精品久久久久久久久| 亚洲国产精品视频在线| 亚洲高清免费在线| 五月天丁香社区| 亚洲伦伦在线| 蜜桃麻豆91| 成人黄色免费短视频| 亚洲欧洲激情在线| www.亚洲激情| 国产精品不卡视频| 性生交大片免费看l| 伊人成年综合电影网| 精品视频一区在线| 涩涩在线视频| 色久欧美在线视频观看| 99riav国产| 亚洲成人自拍一区| 亚洲熟妇一区二区三区| 久久精品国产免费| 伊人再见免费在线观看高清版| 成人在线视频你懂的| 欧美野外猛男的大粗鳮| chinese偷拍一区二区三区| 7777精品伊人久久久大香线蕉超级流畅| 丝袜美腿小色网| 成人午夜碰碰视频| 日本999视频| 性欧美69xoxoxoxo| 精品高清视频| 国产精品原创视频| 欧美国产亚洲视频| 黄色小视频在线免费观看| 欧美精品乱人伦久久久久久| 国产又黄又爽又无遮挡| 久久综合色婷婷| 亚洲自拍第三页| 久久精品九九| 欧美另类videosbestsex日本| 欧美一性一交| 成人福利网站在线观看| 91在线超碰| 熟妇人妻中文av无码| 欧美日韩精品一区二区| 欧美精品亚洲精品日韩精品| 国产精品久久777777| 超碰男人的天堂| 精品影视av免费| 黄色免费观看视频网站| 偷拍欧美精品| 蜜桃网站成人| 一区二区三区四区高清视频| 国产国语刺激对白av不卡| 天堂av在线电影| 中文字幕亚洲综合久久| 姝姝窝人体www聚色窝| 欧美精品一二三| 亚洲 欧美 日韩 在线| 亚洲一区影音先锋| 亚洲欧美综合7777色婷婷| 99re热这里只有精品视频| 日本黄色福利视频| 新67194成人永久网站| 992tv快乐视频| 日韩精品中文字幕第1页| 久久久久高清| 国产一区丝袜| av成人在线电影| 国产一区二区高清在线| 国产精品影院在线观看| 欧美三级网址| 欧美最猛性xxxx| a'aaa级片在线观看| 欧美成人午夜影院| 天天影视久久综合| 正在播放亚洲1区| 男女视频在线观看| 日韩精品福利网站| 日韩一区二区三区在线观看视频 | 91制片厂毛片| 久久九九99| 男人添女人下部高潮视频在观看| 欧美国产精品| 97在线免费视频观看| 91精品国产麻豆国产在线观看| 一级做a爰片久久| 国产综合久久久| 日韩av电影免费播放| 欧美女王vk| 日韩一本精品| 欧美一区二区三| 亚洲一区二区三区精品在线观看| 欧美日韩中文一区二区| 亚洲精品视频一二三| 成人一区二区| 一区二区视频在线播放| 欧美高清视频手机在在线| 亚洲精品日韩在线观看| 欧美r级电影| 黄色网址在线免费看| 91精品一区国产高清在线gif| 人人妻人人澡人人爽精品欧美一区| 欧美韩日一区| 国产欧美综合一区| 午夜国产精品视频| 日本阿v视频在线观看| 野花国产精品入口| 无码人妻丰满熟妇区毛片| 老司机午夜精品视频| 欧美一级裸体视频| 久色婷婷小香蕉久久| 国产91在线免费观看| 成人av资源站| www在线观看免费视频| 国产精品色婷婷久久58| 国产免费久久久久| 亚洲国产精品久久久久秋霞影院| 欧美三级韩国三级日本三斤在线观看| 狠狠躁夜夜躁人人爽超碰91| 午夜视频网站在线观看| 6080yy午夜一二三区久久| 国内精品国产成人国产三级| 亚洲国产天堂久久国产91| 国产三级在线看| 久热在线中文字幕色999舞| 精精国产xxxx视频在线中文版| 韩国美女主播一区| 午夜av成人| 91免费版黄色| 免费欧美视频| 一二三四中文字幕| 亚洲欧美日本国产专区一区| 欧美精品久久久久久久久25p| 国产精品综合二区| 亚洲最大免费视频| 最新国产成人在线观看| 羞羞影院体验区| 欧美一区二区三区男人的天堂| 可以免费观看的毛片| 中文字幕亚洲二区| 成全电影大全在线观看| 国产成人精品免高潮在线观看 | 麻豆mv在线看| 国产免费亚洲高清| 菁菁伊人国产精品| 一区二区不卡在线| 国产欧美欧美| 手机在线视频一区| 91美女片黄在线| 欧美极品视频在线观看| 欧美在线播放高清精品| 欧美一区,二区| 日韩中文字幕在线播放| xx欧美xxx| 国产精品免费视频一区二区| 欧洲杯什么时候开赛| 久久综合久久网| 精品一区二区在线视频| 国精产品一区一区三区免费视频| 亚洲精品高清在线| 一区二区小视频| 日韩精品高清在线| 999福利在线视频| 2020国产精品久久精品不卡| 成人av国产| 中文字幕日本最新乱码视频| 国产成人亚洲综合a∨婷婷图片| 在线免费观看视频| 日韩欧美成人精品| 成人午夜福利视频| 久久精品国产免费观看| 91九色综合| 欧美三日本三级少妇三99| 亚洲黄色天堂| 亚洲少妇一区二区| 亚洲欧美日韩久久| 一区精品在线观看| 一道本无吗dⅴd在线播放一区| 色在线免费观看| 精品久久蜜桃| 中文一区在线| 噜噜噜在线视频| 亚洲成av人片一区二区| 好吊视频一二三区| 久久久久久久一| 国产精品任我爽爆在线播放| 91动漫在线看| 99re这里只有精品6| 日本午夜小视频| 日韩经典第一页| 亚洲天堂导航| 日韩av电影免费播放| 日本亚洲天堂网| wwwww黄色| 欧美日韩国产综合一区二区三区 | 一区二区三区欧美在线观看| 99久久精品免费看国产交换| 久久亚洲精品视频| 欧美电影在线观看一区| 国产一二三四区在线观看| 国产精品一区三区| 久久99久久98精品免观看软件| 欧美大肚乱孕交hd孕妇| 超碰在线资源| 久久人人九九| 日韩不卡免费视频| 99鲁鲁精品一区二区三区| 日韩欧美亚洲国产精品字幕久久久 | 国产黄色免费视频| 中文字幕精品在线| 日韩美女在线| 51xx午夜影福利| 成av人片一区二区| 国产精品免费精品一区| 欲色天天网综合久久| 国产精一区二区| 日本福利视频一区| 久久综合久久鬼色| 在线免费av网| 欧美精品在线网站| 国产一级成人av| 另类小说第一页| 亚洲精品一二三| 无码国产色欲xxxx视频| 国产成人精品在线| 亚洲精品91| 欧美 日本 国产| 欧美日韩国产高清一区二区| 欧美人与禽猛交乱配| 茄子视频成人在线观看| 国产一区二区三区精品视频| 国产精品免费av一区二区| 少妇av一区二区三区| 免费看久久久| www.欧美激情.com| 精品久久久免费| 在线免费观看黄| 国产麻豆日韩| 美国毛片一区二区三区| 国产在线成人精品午夜| 中文字幕日韩av电影| 99re6热只有精品免费观看| 北条麻妃视频在线| 一区二区不卡在线播放| 国产乱视频在线观看| 动漫3d精品一区二区三区| 日韩电影一区二区三区四区| 久青草视频在线观看| 色爱av美腿丝袜综合粉嫩av| 亚洲国产合集| 国产伦精品一区二区三区妓女下载| 色婷婷久久久亚洲一区二区三区| 性xxxxfjsxxxxx欧美|