iOS面試題整理 效能優化

2022-04-12 10:07:27 字數 3327 閱讀 9821

[**]ios效能優化

在效能優化中乙個最具參考價值的屬性是fps:frames per second,其實就是螢幕重新整理率,蘋果的iphone推薦的重新整理率是60hz,也就是說gpu每秒鐘重新整理螢幕60次,這每重新整理一次就是一幀frame,fps也就是每秒鐘重新整理多少幀畫面。靜止不變的頁面fps值是0,這個值是沒有參考意義的,只有當頁面在執行動畫或者滑動的時候,fps值才具有參考價值,fps值的大小體現了頁面的流暢程度高低,當低於45的時候卡頓會比較明顯。

圖層混合:

每乙個layer是乙個紋理,所有的紋理都以某種方式堆疊在彼此的頂部。對於螢幕上的每乙個畫素,gpu需要算出怎麼混合這些紋理來得到畫素rgb的值。

當sa = 0.5時,rgb值為(0.5, 0, 0),可以看出,當兩個不是完全不透明的calayer覆蓋在一起時,gpu大量做這種復合操作,隨著這中操作的越多,gpu越忙碌,效能肯定會受到影響。

公式:

r = s + d * ( 1 – sa )

結果的顏色是源色彩(頂端紋理)+目標顏色(低一層的紋理)*(1-源顏色的透明度)。

當sa = 1時,r = s,gpu將不會做任何合成,而是簡單從這個層拷貝,不需要考慮它下方的任何東西(因為都被它遮擋住了),這節省了gpu相當大的工作量。

1、模擬器debug- 選中 color blended layers紅色區域表示圖層發生了混合

2、instrument-選中core animation-勾選color blended layers

避免圖層混合:

1、確保控制項的opaque屬性設定為true,確保backgroundcolor和父檢視顏色一致且不透明

2、如無特殊需要,不要設定低於1的alpha值

3、確保uiimage沒有alpha通道

uilabel圖層混合解決方法:

ios8以後設定背景色為非透明色並且設定label.layer.maskstobounds=yes讓label只會渲染她的實際size區域,就能解決uilabel的圖層混合問題

ios8 之前只要設定背景色為非透明的就行

為什麼設定了背景色但是在ios8上仍然出現了圖層混合呢?

uilabel在ios8前後的變化,在ios8以前,uilabel使用的是calayer作為底圖層,而在ios8開始,uilabel的底圖層變成了_uilabellayer,繪製文字也有所改變。在背景色的四周多了一圈透明的邊,而這一圈透明的邊明顯超出了圖層的矩形區域,設定圖層的maskstobounds為yes時,圖層將會沿著bounds進行裁剪 圖層混合問題解決了

ios離屏渲染

1、模擬器debug-選中color offscreen - renderd離屏渲染的圖層高亮成黃 可能存在效能問題

2、真機instrument-選中core animation-勾選color offscreen-rendered yellow

離屏渲染的觸發方式

設定了以下屬性時,都會觸發離屏繪製:

1、layer.shouldrasterize(光柵化)

光柵化概念:將圖轉化為乙個個柵格組成的圖象。

光柵化特點:每個元素對應幀緩衝區中的一畫素。

2、masks(遮罩)

3、shadows(陰影)

4、edge antialiasing(抗鋸齒)

5、group opacity(不透明)

6、複雜形狀設定圓角等

7、漸變

8、drawrect

例如我們日程經常打交道的tableviewcell,因為tableviewcell的重繪是很頻繁的(因為cell的復用),如果cell的內容不斷變化,則cell需要不斷重繪,如果此時設定了cell.layer可光柵化。則會造成大量的離屏渲染,降低圖形效能。

現在擺在我們面前得有三個選擇:當前螢幕渲染、離屏渲染、cpu渲染,該用哪個呢?這需要根據具體的使用場景來決定。

盡量使用當前螢幕渲染

鑑於離屏渲染、cpu渲染可能帶來的效能問題,一般情況下,我們要盡量使用當前螢幕渲染。

離屏渲染 vs cpu渲染

由於gpu的浮點運算能力比cpu強,cpu渲染的效率可能不如離屏渲染;但如果僅僅是實現乙個簡單的效果,直接使用cpu渲染的效率又可能比離屏渲染好,畢竟離屏渲染要涉及到緩衝區建立和上下文切換等耗時操作

uibutton 的 maskstobounds = yes又設定setimage、setbackgroundimage、[button setbackgroundcolor:[uicolor colorwithpatternimage:[uiimage imagenamed:@"btn_selected"]]];

下發生離屏渲染,但是[button setbackgroundcolor:[uicolor redcolor]];是不會出現離屏渲染的

關於 uiimageview,現在測試發現(現版本: ios10),在效能的範圍之內,給uiimageview設定圓角是不會觸發離屏渲染的,但是同時給uiimageview設定背景色則肯定會觸發.觸發離屏渲染跟 png.jpg格式並無關聯

日常我們使用layer的兩個屬性,實現圓角

imageview.layer.cornerraidus = cgfloat(10);

imageview.layer.maskstobounds = yes;

這樣處理的渲染機制是gpu在當前螢幕緩衝區外新開闢乙個渲染緩衝區進行工作,也就是離屏渲染,這會給我們帶來額外的效能損耗。如果這樣的圓角操作達到一定數量,會觸發緩衝區的頻繁合併和上下文的的頻繁切換,效能的代價會巨集觀地表現在使用者體驗上——掉幀

光柵化是將幾何資料經過一系列變換後最終轉換為畫素,從而呈現在顯示裝置上的過程,光柵化的本質是座標變換、幾何離散化

我們使用 uitableview 和 uicollectionview 時經常會遇到各個 cell 的樣式是一樣的,這時候我們可以使用這個屬性提高效能:

cell.layer.shouldrasterize=yes;

cell.layer.rasterizationscale=[[uiscreenmainscreen]scale];

頁面間跳轉的效能優化:

t

iOS面試題 效能優化篇

降低包大小需要從兩方面著手 1 模擬器debug中color blended layers紅色區域表示圖層發生了混合 2 instrument 選中core animation 勾選color blended layers 避免圖層混合 uilabel圖層混合解決方法 ios8以後設定背景色為非透明...

通過面試題看效能優化

不管是自己之前面試還是看網上的面試題,都會碰到乙個經典的面試題 從輸入url到頁面載入完成,發生了什麼?首先說一下自己對於這道題的理解和回答 使用者在瀏覽器中輸入url 瀏覽器通過dns,把url解析為ip 和ip位址建立tcp連線,傳送http請求 伺服器接收請求,進行相關操作後返回的htpp相應...

面試題整理

2014.3.19日整理 1.建立一張表hack 裡面就乙個欄位num,然後用sql語句從1開始插入到100,怎麼寫?oracle 答 1.create tablehack num number 建表語句 2.begin for i in1.100loop insert intohack num v...