亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發教程之常見的性能優化技巧

2020-07-26 02:20:59
字體:
來源:轉載
供稿:網友

前言

性能問題的主要原因是什么,原因有相同的,也有不同的,但歸根到底,不外乎內存使用、代碼效率、合適的策略邏輯、代碼質量、安裝包體積這一類問題。

但從用戶體驗的角度去思考,當我們置身處地得把自己當做用戶去玩一款應用時候,那么都會在意什么呢?假如正在玩一款手游,首先一定不希望玩著玩著突然閃退,然后就是不希望卡頓,其次就是耗電和耗流量不希望太嚴重,最后就是安裝包希望能小一點。簡單歸類如下:

快:使用時避免出現卡頓,響應速度快,減少用戶等待的時間,滿足用戶期望。
穩:不要在用戶使用過程中崩潰和無響應。
省:節省流量和耗電,減少用戶使用成本,避免使用時導致手機發燙。
?。喊惭b包小可以降低用戶的安裝成本。

一、快

應用啟動慢,使用時經??D,是非常影響用戶體驗的,應該盡量避免出現。卡頓的場景有很多,按場景可以分為4類:UI 繪制、應用啟動、頁面跳轉、事件響應。引起卡頓的原因很多,但不管怎么樣的原因和場景,最終都是通過設備屏幕上顯示來達到用戶,歸根到底就是顯示有問題,

根據iOS 系統顯示原理可以看到,影響繪制的根本原因有以下兩個方面:

1.繪制任務太重,繪制一幀內容耗時太長。
2.主線程太忙,根據系統傳遞過來的 VSYNC 信號來時還沒準備好數據導致丟幀。

繪制耗時太長,有一些工具可以幫助我們定位問題。主線程太忙則需要注意了,主線程關鍵職責是處理用戶交互,在屏幕上繪制像素,并進行加載顯示相關的數據,所以特別需要避免任何主線程的事情,這樣應用程序才能保持對用戶操作的即時響應??偨Y起來,主線程主要做以下幾個方面工作:

1.UI 生命周期控制
2.系統事件處理
3.消息處理
4.界面布局
5.界面繪制
6.界面刷新

除此之外,應該盡量避免將其他處理放在主線程中,特別復雜的數據計算和網絡請求等。

二、穩

應用的穩定性定義很寬泛,影響穩定性的原因很多,比如內存使用不合理、代碼異常場景考慮不周全、代碼邏輯不合理等,都會對應用的穩定性造成影響。其中最常見的兩個場景是:Crash 和 ANR,這兩個錯誤將會使得程序無法使用,比較常用的解決方式如下:

1.提高代碼質量。比如開發期間的代碼審核,看些代碼設計邏輯,業務合理性等。
2.代碼靜態掃描工具。常見工具有Clang Static Analyzer、OCLint、Infer等等。
3.Crash監控。把一些崩潰的信息,異常信息及時地記錄下來,以便后續分析解決。
4.Crash上傳機制。在Crash后,盡量先保存日志到本地,然后等下一次網絡正常時再上傳日志信息。

三、省

在移動設備中,電池的重要性不言而喻,沒有電什么都干不成。對于操作系統和設備開發商來說,耗電優化一致沒有停止,去追求更長的待機時間,而對于一款應用來說,并不是可以忽略電量使用問題,特別是那些被歸為“電池殺手”的應用,最終的結果是被卸載。因此,應用開發者在實現需求的同時,需要盡量減少電量的消耗。

1.CPU

不論用戶是否正在直接使用, CPU 都是應用所使用的主要硬件, 在后臺操作和處理推送通知時, 應用仍然會消耗 CPU 資源
應用計算的越多,消耗的電量越多.在完成相同的基本操作時, 老一代的設備會消耗更多的電量, 計算量的消耗取決于不同的因素

2.網絡

智能的網絡訪問管理可以讓應用響應的更快,并有助于延長電池壽命.在無法訪問網絡時,應該推遲后續的網絡請求, 直到網絡連接恢復為止. 此外,應避免在沒有連接 WiFi 的情況下進行高寬帶消耗的操作.比如視頻流, 眾所周知,蜂窩無線系統(LTE,4G,3G等)對電量的消耗遠遠大于 WiFi信號,根源在于 LTE 設備基于多輸入,多輸出技術,使用多個并發信號以維護兩端的 LTE 鏈接,類似的,所有的蜂窩數據鏈接都會定期掃描以尋找更強的信號. 因此:我們需要

1)在進行任何網絡操作之前,先檢查合適的網絡連接是否可用
2)持續監視網絡的可用性,并在鏈接狀態發生變化時給與適當的反饋
3).定位管理器和** GPS**

我們都知道定位服務是很耗電的,使用 GPS 計算坐標需要確定兩點信息:

1)時間鎖每個 GPS 衛星每毫秒廣播唯一一個1023位隨機數, 因而數據傳播速率是1.024Mbit/s GPS 的接收芯片必須正確的與衛星的時間鎖槽對齊
2)頻率鎖 GPS 接收器必須計算由接收器與衛星的相對運動導致的多普勒偏移帶來的信號誤差

計算坐標會不斷的使用 CPU 和 GPS 的硬件資源,因此他們會迅速的消耗電池電量, 那么怎么減少呢?

1)關閉無關緊要的特性

判斷何時需要跟蹤位置的變化, 在需要跟蹤的時候調用 startUpdatingLocation方法,無須跟蹤時調用stopUpdatingLocation方法.
當應用在后臺運行或用戶沒有與別人聊天時,也應該關閉位置跟蹤,也就說說,瀏覽媒體庫,查看朋友列表或調整應用設置時, 都應該關閉位置跟蹤

2)只在必要時使用網絡

為了提高電量的使用效率, IOS 總是盡可能地保持無線網絡關閉.當應用需要建立網絡連接時,IOS 會利用這個機會向后臺應用分享網絡會話,以便一些低優先級能夠被處理, 如推送通知,收取電子郵件等

關鍵在于每當用戶建立網絡連接時,網絡硬件都會在連接完成后多維持幾秒的活動時間.每次集中的網絡通信都會消耗大量的電量
要想減輕這個問題帶來的危害,你的軟件需要有所保留的的使用網絡.應該定期集中短暫的使用網絡,而不是持續的保持著活動的數據流.只有這樣,網絡硬件才有機會關閉

4.屏幕

屏幕非常耗電, 屏幕越大就越耗電.當然,如果你的應用在前臺運行且與用戶進行交互,則勢必會使用屏幕并消耗電量
這里有一些方案可以優化屏幕的使用:

1)動畫優化

當應用在前臺時, 使用動畫,一旦應用進入了后臺,則立即暫停動畫.通常來說,你可以通過監聽 UIApplicationWillResignActiveNotification或UIApplicationDIdEnterBackgroundNotification的通知事件來暫?;蛲V箘赢?也可以通過監聽UIApplicationDidBecomeActiveNotification的通知事件來恢復動畫

2)視頻優化

視頻播放期間,最好保持屏幕常量.可以使用UIApplication對象的idleTimerDisabled屬性來實現這個目的.一旦設置了 YES, 他會阻止屏幕休眠,從而實現常亮.

與動畫類似,你可以通過相應應用的通知來釋放和獲取鎖

用戶總是隨身攜帶者手機,所以編寫省電的代碼就格外重要, 畢竟手機的移動電源并不是隨處可見, 在無法降低任務復雜性時, 提供一個對電池電量保持敏感的方案并在適當的時機提示用戶, 會讓用戶體驗良好。

四、小

應用安裝包大小對應用使用沒有影響,但應用的安裝包越大,用戶下載的門檻越高,特別是在移動網絡情況下,用戶在下載應用時,對安裝包大小的要求更高,因此,減小安裝包大小可以讓更多用戶愿意下載和體驗產品。

當然,瘦身和減負雖好,但需要注意瘦身對于項目可維護性的影響,建議根據自身的項目進行技巧的選取。

App安裝包是由資源和可執行文件兩部分組成,安裝包瘦身從以下三部分優化。

資源優化:

1.刪除無用的資源

2.刪除重復的資源

3.無損壓縮圖片

4.不常用資源換為下載

編譯優化:

1.去除debug符號

2.開啟編譯優化

3.避免編譯多個架構

可執行文件優化:

1.去除無用代碼

2.統計庫占用,去除無用庫

3.混淆類/方法名

4.減少冗余字符串

5.ARC->MRC (一般不到特殊情況不建議這么做,會提高維護成本)

縮減iOS安裝包大小是很多中大型APP都要做的事,一般首先會對資源文件下手,壓縮圖片/音頻,去除不必要的資源。這些資源優化做完后,我們還可以嘗試對可執行文件進行瘦身,項目越大,可執行文件占用的體積越大,又因為AppStore會對可執行文件加密,導致可執行文件的壓縮率低,壓縮后可執行文件占整個APP安裝包的體積比例大約有80%~90%,還是挺值得優化的。

下面是一些常見的優化方案:

TableViewCell 復用

在cellForRowAtIndexPath:回調的時候只創建實例,快速返回cell,不綁定數據。在willDisplayCell: forRowAtIndexPath:的時候綁定數據(賦值)。

高度緩存

在tableView滑動時,會不斷調用heightForRowAtIndexPath:,當cell高度需要自適應時,每次回調都要計算高度,會導致 UI 卡頓。為了避免重復無意義的計算,需要緩存高度。

怎么緩存?

字典,NSCache。

UITableView-FDTemplateLayoutCell

[if !supportLineBreakNewLine]

[endif]

視圖層級優化

不要動態創建視圖

在內存可控的前提下,緩存subview。

善用hidden。

[if !supportLineBreakNewLine]

[endif]

減少視圖層級

減少subviews個數,用layer繪制元素。

少用clearColor,maskToBounds,陰影效果等。

[if !supportLineBreakNewLine]

[endif]

減少多余的繪制操作

圖片

不要用JPEG的圖片,應當使用PNG圖片。

子線程預解碼(Decode),主線程直接渲染。因為當image沒有Decode,直接賦值給imageView會進行一個Decode操作。

優化圖片大小,盡量不要動態縮放(contentMode)。

盡可能將多張圖片合成為一張進行顯示。

[if !supportLineBreakNewLine][endif]

減少透明view

使用透明view會引起blending,在iOS的圖形處理中,blending主要指的是混合像素顏色的計算。最直觀的例子就是,我們把兩個圖層疊加在一起,如果第一個圖層的透明的,則最終像素的顏色計算需要將第二個圖層也考慮進來。這一過程即為Blending。

會導致blending的原因:

UIView的alpha<1。

UIImageView的image含有alpha channel(即使UIImageView的alpha是1,但只要image含有透明通道,則仍會導致blending)。

[if !supportLineBreakNewLine][endif]

為什么blending會導致性能的損失?

原因是很直觀的,如果一個圖層是不透明的,則系統直接顯示該圖層的顏色即可。而如果圖層是透明的,則會引起更多的計算,因為需要把另一個的圖層也包括進來,進行混合后的顏色計算。

opaque設置為YES,減少性能消耗,因為GPU將不會做任何合成,而是簡單從這個層拷貝。

[if !supportLineBreakNewLine][endif]

減少離屏渲染

離屏渲染指的是在圖像在繪制到當前屏幕前,需要先進行一次渲染,之后才繪制到當前屏幕。

OpenGL中,GPU屏幕渲染有以下兩種方式:

On-Screen

Rendering即當前屏幕渲染,指的是GPU的渲染操作是在當前用于顯示的屏幕緩沖區中進行。

Off-Screen

Rendering即離屏渲染,指的是GPU在當前屏幕緩沖區以外新開辟一個緩沖區進行渲染操作。

[if !supportLineBreakNewLine][endif]

小結

性能優化不是更新一兩個版本就可以解決的,是持續性的需求,持續集成迭代反饋。在實際的項目中,在項目剛開始的時候,由于人力和項目完成時間限制,性能優化的優先級比較低,等進入項目投入使用階段,就需要把優先級提高,但在項目初期,在設計架構方案時,性能優化的點也需要提早考慮進去,這就體現出一個程序員的技術功底了。
什么時候開始有性能優化的需求,往往都是從發現問題開始,然后分析問題原因及背景,進而尋找最優解決方案,最終解決問題,這也是日常工作中常會用到的處理方式。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲欧洲高清一区| 欧美性videos高清精品| 成人免费直播live| 亚洲成人精品av| 欧美一级在线播放| 久久久久久中文| 久久国产精品久久久久久久久久| 性色av一区二区三区在线观看| 日韩理论片久久| 亚洲第一色中文字幕| 日韩电视剧免费观看网站| 欧美高清性猛交| 欧美激情第6页| 欧美日本高清一区| 亚洲男人天堂视频| 一区二区三区无码高清视频| 国产91在线高潮白浆在线观看| 国产精品视频公开费视频| 91精品国产91久久久| 亚洲激情免费观看| 久久久欧美精品| 亚洲欧美在线第一页| 亚洲aⅴ日韩av电影在线观看| 成人黄色免费片| 一本大道久久加勒比香蕉| 国产va免费精品高清在线| 国产精品成人一区| 一本久久综合亚洲鲁鲁| 亚洲色图激情小说| 国产精品视频免费在线观看| 欧美性受xxxx黑人猛交| 久久国产精品99国产精| 亚洲视频在线观看网站| 亚洲天堂第二页| 精品久久久香蕉免费精品视频| 亚洲精品久久久久中文字幕欢迎你| 色噜噜狠狠狠综合曰曰曰88av| 91中文在线视频| 国产精品视频最多的网站| 色哟哟亚洲精品一区二区| 亚洲欧洲成视频免费观看| 久久综合九色九九| 日韩大片在线观看视频| 亚洲天堂男人的天堂| 欧美激情精品久久久久久黑人| 亚洲激情视频网站| 欧美激情一区二区三级高清视频| 久久视频在线观看免费| 日韩一区二区在线视频| 国产精品久久久久免费a∨大胸| 久久免费精品日本久久中文字幕| 欧美国产高跟鞋裸体秀xxxhd| 亚洲图片在线综合| 精品综合久久久久久97| 久久久久亚洲精品国产| 久久久久久免费精品| 91精品国产色综合久久不卡98| 久久久国产一区二区| 国产欧美亚洲视频| 成人av.网址在线网站| 欧美国产日本高清在线| 国产69精品久久久| 欧美日韩国产中字| 欧美激情一区二区三区高清视频| 精品免费在线视频| 日本一区二区三区在线播放| 亚洲国产欧美一区二区三区久久| 成人h视频在线观看播放| 在线观看欧美日韩| 亚洲综合中文字幕在线观看| 97色在线播放视频| 久久国产精品视频| 成人在线观看视频网站| 8x海外华人永久免费日韩内陆视频| 丝袜亚洲另类欧美重口| 欧美日韩国产中文精品字幕自在自线| 国产999在线观看| 欧美性猛交xxxx| 久久久久久久久网站| 韩曰欧美视频免费观看| 国产精品h在线观看| 日韩中文理论片| 国产999精品久久久| 日本亚洲欧洲色α| 亚洲欧美在线一区| 97超视频免费观看| 国产精品中文字幕在线观看| 91香蕉国产在线观看| 国产精品久久久久久久久久小说| 成人在线视频网站| 国产精品99久久久久久人| 亚洲精品美女网站| 中文字幕免费国产精品| 国产精品小说在线| 国产精品日韩欧美大师| 亚洲欧美国产精品专区久久| 欧美成人精品在线| 91久久久在线| 欧美日本黄视频| 国产精品小说在线| 国产一区二区精品丝袜| 亚洲国产天堂网精品网站| 91精品国产乱码久久久久久久久| 国产精品久久久久久久久久小说| 精品国内亚洲在观看18黄| 日本午夜人人精品| 亚洲www在线| 亚洲第一中文字幕| 久热精品视频在线观看| 欧美日韩成人在线播放| 亚洲白虎美女被爆操| 清纯唯美亚洲综合| 亚洲视频axxx| 激情亚洲一区二区三区四区| 91精品国产高清| 国产精品欧美在线| 91精品久久久久久久久久入口| 欧美精品videos性欧美| 亚洲男人天堂视频| 亚洲激情 国产| 国产精品h片在线播放| 国产一区二区日韩精品欧美精品| 色老头一区二区三区在线观看| 91精品国产91久久久久久久久| 国产视频久久久久久久| www.美女亚洲精品| 在线观看国产成人av片| 亚洲最大福利网站| 日日摸夜夜添一区| 午夜精品理论片| 国产一区二区三区在线免费观看| 97热在线精品视频在线观看| 久久综合网hezyo| 欧美午夜丰满在线18影院| 亚洲第一区在线| 欧美电影在线观看高清| 欧美午夜精品久久久久久浪潮| 欧美午夜精品久久久久久久| 欧美日本高清一区| 热99精品里视频精品| 亚洲jizzjizz日本少妇| 国产一区二区久久精品| 国产精品美女网站| 午夜精品久久久久久久久久久久久| 亚洲美女av在线| 久久久久久久一区二区三区| 亚洲国产欧美一区二区三区久久| 成人免费黄色网| 日韩免费不卡av| 久久久视频免费观看| 日韩一区视频在线| 亚洲女人天堂网| 国产成人精品视| 日韩一区二区久久久| 自拍偷拍亚洲区| 欧美在线视频一二三| 久久久久久久国产精品视频| 国产成人精品午夜| 欧美中文字幕视频在线观看| 国产在线999| 欧美日韩国产一区在线| 粉嫩老牛aⅴ一区二区三区| 韩国福利视频一区| 欧美做爰性生交视频|