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

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

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

094022i77u2tzl5dd2c9ac.jpg

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

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

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

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

QcQlN7B.png

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

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

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

1gfFoLK.png

可以很清楚地看到 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。同時過多的幾何結構會大大增多需要渲染的 OpenGL 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 的測量情況看,下面會介紹

w0P0Umn.png

PEewOzw.png

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

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

01.png

P8HgZx5.png

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

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

3JB2vEk.png

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

GPU Driver

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

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

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

02.png

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

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

責任編輯:李英杰 來源: 騰訊Bugly
相關推薦

2015-12-23 09:16:33

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渲染機制

2025-06-23 00:03:00

2023-06-27 08:37:35

Java反射動態代理機制

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技術棧公眾號

亚洲欧美亚洲| 国产精品xxx| 91在线你懂得| 国产精品91视频| 国产麻豆a毛片| 中文在线综合| 91久久免费观看| 免费在线精品视频| 五月天婷婷在线观看| 日本女人一区二区三区| 欧美黄色免费网站| 欧美做受高潮6| 亚洲精品一区二区三区在线| 欧美视频在线免费看| 亚洲制服中文| 丝袜视频国产在线播放| 狠狠色综合色综合网络| 91精品国产色综合久久不卡98| 亚洲av无码国产精品麻豆天美| 精品视频一二| 欧美在线一二三四区| 国产 欧美 日本| 成人77777| 99在线热播精品免费| 国产精品欧美激情| 精品成人av一区二区在线播放| 久久人人99| 亚洲欧美制服另类日韩| 91人人澡人人爽| 在线免费成人| 欧美在线短视频| 国产欧美日韩网站| 成人影院www在线观看| 久久色在线观看| 国产精品对白刺激久久久| 亚洲熟女乱色一区二区三区久久久| 精品二区久久| 精品国偷自产在线视频| 男人天堂av电影| 国产精品对白久久久久粗| 717成人午夜免费福利电影| 人妻丰满熟妇av无码区app| 麻豆国产在线| 亚洲一区二区三区四区中文字幕| 中文字幕中文字幕在线中一区高清| 欧美挠脚心网站| 99精品国产视频| 风间由美一区二区三区| 国产美女精品视频国产| 久久精品国产一区二区三区免费看 | 国产熟人av一二三区| 97人澡人人添人人爽欧美| 亚洲一区二区在线免费观看视频| 桥本有菜av在线| 福利视频在线| 亚洲婷婷综合久久一本伊一区 | 亚洲精品乱码久久久久久蜜桃欧美| 免费视频成人| 欧美日韩国产综合久久| 中文字幕av专区| 成人免费毛片嘿嘿连载视频…| 色综合咪咪久久| 国产精品亚洲a| 樱花草涩涩www在线播放| 欧美日韩亚洲视频一区| 一本大道熟女人妻中文字幕在线 | 欧美偷拍一区二区| 浓精h攵女乱爱av| 青青草国产一区二区三区| 欧美三级午夜理伦三级中视频| 亚洲精品久久久中文字幕| 久久久久黄色| 7777精品久久久大香线蕉| 国产成人精品综合久久久久99 | 欧美在线激情| 欧美边添边摸边做边爱免费| 一区二区在线观看免费| 日韩亚洲欧美一区二区| h片在线观看下载| 岛国av在线不卡| 男人插女人下面免费视频| 高清欧美日韩| 欧美一卡2卡三卡4卡5免费| 国产人妖在线观看| 青青一区二区| 少妇高潮久久久久久潘金莲| 波多野结衣家庭教师| 最新国产拍偷乱拍精品| 国产成人久久精品| 国产片高清在线观看| 成人免费黄色大片| 欧美一区二区三区四区在线观看地址 | 亚洲国产91视频| 精品国产第一区二区三区观看体验| 免费日本黄色网址| 成人vr资源| 欧美劲爆第一页| 啪啪小视频网站| 国产另类ts人妖一区二区| 国产传媒一区| 午夜在线视频播放| 午夜视频在线观看一区| 黄色手机在线视频| 国产精品网站在线看| 国产亚洲一级高清| 久久精品视频6| 日本 国产 欧美色综合| 99在线免费观看视频| 成人综合影院| 亚洲电影一区二区三区| 日韩不卡一二三| 日韩aaa久久蜜桃av| 久久精品免费电影| 天天射天天干天天| 国产成人精品免费在线| 四虎影院一区二区三区| 污视频免费在线观看| 日本道精品一区二区三区 | 亚洲精品国产精品国自产网站按摩 | 日本精品久久久| jlzzjlzzjlzz亚洲人| 久久久久久久久99精品| 成人一级生活片| 高清久久一区| 深夜福利91大全| 精品久久久久久久久久久久久久久久久久| 国产一区二区三区在线观看免费 | 久久人人97超碰人人澡爱香蕉| caoporn97在线视频| 欧美性一二三区| 国产男女猛烈无遮挡a片漫画| 欧美一区在线看| 成人黄色av网站| 在线日本视频| 欧美在线看片a免费观看| 欧美xxxxx少妇| 国语对白精品一区二区| 91网站在线免费观看| 1769在线观看| 欧美主播一区二区三区美女| 免费黄色在线视频| 国产精品视区| 麻豆av一区| 正在播放日韩精品| 日韩电影视频免费| 国产成人无码精品久在线观看| 国产精品一区二区久激情瑜伽| 影音欧美亚洲| 91视频成人| 久久影院在线观看| 国产又大又粗又长| 亚洲欧美日韩中文播放| 一二三av在线| 欧美一区二区三区久久精品| 91欧美精品成人综合在线观看| 免费观看在线午夜影视| 欧美久久一二三四区| 精品一区二区三区国产| 婷婷激情五月综合| 欧美激情中文不卡| 国产一区二区在线免费播放| 久久密一区二区三区| 成人久久一区二区三区| 超碰免费公开在线| 精品欧美一区二区在线观看| 国产精品18p| wwwwxxxxx欧美| 黄色高清无遮挡| 色97色成人| 91最新在线免费观看| 色网在线观看| 亚洲国产精品免费| 欧美成人精品网站| 亚洲欧美综合色| 欧美一级大片免费看| 亚洲三级网站| 水蜜桃亚洲一二三四在线| 日本亚洲欧洲无免费码在线| 欧美成人午夜激情| 天堂av在线免费观看| 在线观看国产一区二区| 中文字幕求饶的少妇| 国产成人一区二区精品非洲| 国产精品裸体瑜伽视频| 国产日产精品一区二区三区四区的观看方式 | 最近2019好看的中文字幕免费 | 日韩av在线免费观看一区| 五月婷婷六月婷婷| 亚洲免费视频成人| 久久人人爽人人爽人人片| 日本不卡一二三区黄网| 欧美乱做爰xxxⅹ久久久| 自拍偷拍欧美亚洲| 91在线播放网址| 日本在线一二三区| 精久久久久久| 亚洲成人蜜桃| 视频一区视频二区欧美| 青青草成人在线| 18videosex性欧美麻豆| 日韩电影在线观看永久视频免费网站| av毛片在线免费观看| 一区二区三区日韩| 欧美老女人性生活视频| 国产传媒欧美日韩成人| 中文字幕无码不卡免费视频| 亚洲理论电影网| 裸模一区二区三区免费| 日韩精品一区二区三区免费视频| 欧亚精品中文字幕| 日韩伦理电影网站| 色视频www在线播放国产成人| 国产 日韩 欧美 精品| 欧美视频一区在线| 91精品国产乱码在线观看| 亚洲同性gay激情无套| 中文字幕网站在线观看| 成人免费av网站| 91制片厂毛片| 亚洲精品一区二区妖精| 欧美另类一区| 97色成人综合网站| 成人黄色在线观看| 在线成人视屏| 91国语精品自产拍在线观看性色| av免费在线观| 中文字幕日韩欧美在线| 男人的天堂在线| 亚洲精品v欧美精品v日韩精品| 国产精品午夜福利| 欧美另类videos死尸| 日韩中文字幕高清| 欧美性高跟鞋xxxxhd| 日本一区二区免费在线观看| 曰韩精品一区二区| 538任你躁在线精品视频网站| 国产欧美视频一区二区三区| 51调教丨国产调教视频| 成人国产视频在线观看| 久久久国产精品久久久| 狠狠色2019综合网| 中文字幕55页| 国产一本一道久久香蕉| 中文字幕1234区| 国内成+人亚洲+欧美+综合在线 | 91精品国产乱码在线观看| 亚洲国产美国国产综合一区二区| 欧美三级在线免费观看| 亚洲美女免费在线| 欧洲第一无人区观看| 亚洲女同女同女同女同女同69| 呻吟揉丰满对白91乃国产区| 久久综合一区二区| 美女又爽又黄视频毛茸茸| 26uuu国产在线精品一区二区| 日本少妇毛茸茸| 99国产精品久久久久久久久久久| 久久人人爽人人爽人人片| 久久人人超碰精品| 亚洲精品成人无码| 国产精品久久三区| 内射一区二区三区| 亚洲一区二区精品视频| 国产一级理论片| 欧美日韩精品在线| 日韩黄色片网站| 欧美日韩亚洲综合在线| 国产一区二区女内射| 欧美一区二区三区四区在线观看| www.我爱av| 日韩高清a**址| 蜜桃成人在线视频| 日韩在线视频导航| 在线中文字幕视频观看| 97国产精品视频人人做人人爱| 一区二区电影免费观看| 国产精品视频色| 在线视频亚洲欧美中文| 精品一区二区三区国产| 日韩午夜电影网| 99久久久精品视频| 日韩成人dvd| 波多野结衣中文字幕在线播放| 不卡区在线中文字幕| 中文字幕丰满乱子伦无码专区| 中文乱码免费一区二区| 欧美日韩综合一区二区| 欧美日韩一区二区免费视频| 亚洲一区中文字幕永久在线| 亚洲精品一线二线三线| 超碰国产在线观看| 欧美激情喷水视频| 精品肉辣文txt下载| 国产女主播一区二区| 欧美日韩国产免费观看视频| 996这里只有精品| 久久精品麻豆| 在线播放av网址| 国产欧美日韩综合| 国产第一页在线播放| 欧美在线观看一区二区| 亚洲国产欧美另类| 国产亚洲精品91在线| 欧美另类tv| 国产欧洲精品视频| 亚洲日产av中文字幕| 麻豆一区二区三区在线观看| 性欧美videos另类喷潮| 久久久久亚洲av片无码v| 国产亚洲精品资源在线26u| 久久中文字幕无码| 欧美日韩一区三区| 亚洲人妻一区二区三区| 久久国产精品久久精品| 欧美特大特白屁股xxxx| 国产美女在线精品免费观看| 日韩中文字幕高清在线观看| 波多野结衣家庭教师在线播放| 精品一区二区综合| 一级黄色片大全| 亚洲午夜在线观看视频在线| 国产精品伊人久久| 永久免费看mv网站入口亚洲| 中日韩脚交footjobhd| 国产高清精品一区| 欧美一区二区三区另类 | 成人午夜激情片| 五月天丁香激情| 欧美绝品在线观看成人午夜影视| 蜜芽tv福利在线视频| 97在线视频一区| 精品精品国产毛片在线看| 国产精品一二三在线观看| 黄页网站大全一区二区| 福利视频第一页| 欧美性大战久久久| jizz在线观看视频| 国产精品美女网站| 欧美国产美女| 不用播放器的免费av| 国产精品免费av| 91精品国产乱码久久久| 最近2019中文字幕大全第二页 | 欧美自拍丝袜亚洲| 成年在线电影| 国产欧美一区二区三区视频| 欧美激情欧美| 九九九九九九九九| 一区二区高清免费观看影视大全 | 日韩成人av毛片| 亚洲国产欧美在线成人app| 国精一区二区三区| 国产精品裸体一区二区三区| 一区二区自拍| jlzzjizz在线播放观看| 一本久道久久综合中文字幕| 国产在线观看网站| 国产精品久久久久9999| 久久一区二区三区喷水| 午夜一级免费视频| 亚洲免费观看高清在线观看| 高清毛片aaaaaaaaa片| 91成人国产在线观看| 久久99高清| 高清av免费看| 亚洲观看高清完整版在线观看 | 成人福利电影精品一区二区在线观看| 久久久久久久黄色| 日韩精品中文字幕在线观看| 亚洲精品在线影院| 中文字幕一区二区三区在线乱码| 国产a久久麻豆| www欧美在线| 日韩在线视频免费观看| 欧美大片91| 免费在线观看的av网站| 国产精品亲子乱子伦xxxx裸| 午夜精品久久久久久久96蜜桃 | 日韩中文字幕免费看| 视频亚洲一区二区| 免费高清在线观看免费| 自拍偷拍亚洲综合| 黄色一级a毛片| 国产精品视频一区二区高潮| 在线观看日韩| 熟女人妻在线视频| 在线成人av网站| 免费成人在线电影| 强伦女教师2:伦理在线观看| av在线免费不卡| 国产一区二区麻豆| 51午夜精品视频| 欧美99在线视频观看| 中文字幕在线观看的网站| 91精品国产色综合久久不卡电影| 蜜桃视频在线网站| 乱熟女高潮一区二区在线| 国产女人水真多18毛片18精品视频 | 久久久久久久有限公司| 国产一区二区影院|