iOS應(yīng)用流暢度辨析

在過(guò)去幾年間汛闸,移動(dòng)應(yīng)用以雷霆之勢(shì)席卷全球艺骂。我們?cè)诠ぷ骱托蓍e時(shí)間中使用互聯(lián)網(wǎng)的方式,已經(jīng)隨著移動(dòng)應(yīng)用的前進(jìn)腳步發(fā)生了變革别伏。在開發(fā)應(yīng)用的時(shí)候,人們也開始考慮“移動(dòng)優(yōu)先”的做法宦芦。我們正在面對(duì)全新一代的移動(dòng)設(shè)備调卑,諸如可穿戴設(shè)備或眾多移動(dòng)配件——正是它們構(gòu)成了“萬(wàn)物互聯(lián)”的世界大咱。我們將面對(duì)全新的用戶界面,通過(guò)它們數(shù)據(jù)展示及指令接收處理溯捆。同時(shí)提揍,我們還將看到煮仇,越來(lái)越多的公司將真正地踐行“移動(dòng)優(yōu)先”的思路浙垫。而在未來(lái)數(shù)年中,這一切都將影響我們?cè)O(shè)計(jì)杉武、開發(fā)和測(cè)試軟件的方式轻抱。

把一個(gè)客戶端做得穩(wěn)定圾亏、無(wú)奔潰封拧、流暢,是寫客戶端朋友的夢(mèng)想曹铃,但是陕见,我們面臨的結(jié)果往往是不如人意的。天下武功灰粮,唯快不破忍坷。很多公司都信奉這個(gè)教條。恨不得把a(bǔ)pp開發(fā)周期壓縮到最低,這就導(dǎo)致了開發(fā)中隱藏了很多問(wèn)題柑肴。有點(diǎn)經(jīng)驗(yàn)的工程師草率的優(yōu)化一下,更糟的情況是那些沒(méi)有經(jīng)驗(yàn)的工程師甚至不會(huì)對(duì)app進(jìn)行任何優(yōu)化晰骑,這將會(huì)使情況變的更糟硕舆。

十年前,移動(dòng)設(shè)備的硬件資源是非常有限的.甚至連浮點(diǎn)數(shù)都是被禁止的.因?yàn)楦↑c(diǎn)數(shù)能導(dǎo)致計(jì)算的速度變慢岗宣×苎科技發(fā)展如此迅速的今天,硬件很大程度上可以彌補(bǔ)軟件的短板。但是硬件的進(jìn)步終究無(wú)法掩飾軟件的不足刊咳,這也是寫這篇文章的初心娱挨。

移動(dòng)端關(guān)注要點(diǎn)

在程序開發(fā)中捕犬,測(cè)試是必不可少的碉碉。移動(dòng)端測(cè)試按大的類型劃分可以分為白盒測(cè)試和黑盒測(cè)試。

白盒測(cè)試一般是由開發(fā)人員使用編碼的方式進(jìn)行贴届。測(cè)試者需要接觸程序的內(nèi)部代碼毫蚓;而黑盒測(cè)試可以在不知道程序內(nèi)部結(jié)構(gòu)和代碼的情況下進(jìn)行。

下面是主要的測(cè)試流程了:
冒煙測(cè)試:在軟件測(cè)試中畔乙,冒煙測(cè)試是指快速驗(yàn)證APP的主要功能(例如:微信的登陸啸澡、退出氮帐、發(fā)消息等功能) 。如果沒(méi)有發(fā)現(xiàn)問(wèn)題皮服,再進(jìn)行更加深入的測(cè)試工作龄广;如果發(fā)現(xiàn)有問(wèn)題蕴侧,就說(shuō)明APP有重大缺陷净宵。

功能測(cè)試:功能測(cè)試也叫行為測(cè)試,需要根據(jù)測(cè)試用例來(lái)驗(yàn)證應(yīng)用預(yù)期的功能有沒(méi)有實(shí)現(xiàn)紧武。

自由探索式測(cè)試:嘗試邊界條件阻星、輸入特殊符號(hào)已添、異常網(wǎng)絡(luò)環(huán)境、突然中斷程序等操作 畦幢。功能測(cè)試的目的是驗(yàn)證正常的功能有沒(méi)有實(shí)現(xiàn)呛讲,而自由探索測(cè)試的目的就是為了試試應(yīng)用在極端的操作下會(huì)不會(huì)出現(xiàn)問(wèn)題返奉。探索式測(cè)試就是要找到能讓應(yīng)用出錯(cuò)的操作。

回歸測(cè)試:對(duì)之前使用我們的服務(wù)測(cè)試過(guò)的應(yīng)用雷逆,將案例復(fù)測(cè)一遍污尉。

移動(dòng)端關(guān)注的一些指標(biāo)
運(yùn)行多少小時(shí)不崩潰;
多次打開頁(yè)面某宪,控制崩潰率兴喂;
界面優(yōu)化焚志,如何才能讓用戶不急躁酱酬、不煩躁;
服務(wù)器沒(méi)有返回?cái)?shù)據(jù)汗菜,是否會(huì)導(dǎo)致奔潰挑社;
網(wǎng)絡(luò)不好滔灶,數(shù)據(jù)來(lái)的太慢,界面是否不流暢麻车;
從數(shù)據(jù)庫(kù)讀的數(shù)據(jù)太慢如何解決等动猬。

移動(dòng)端界面應(yīng)該有自己的邏輯表箭,需要網(wǎng)絡(luò)數(shù)據(jù)的地方,應(yīng)該有默認(rèn)值彼水,這樣在網(wǎng)絡(luò)數(shù)據(jù)沒(méi)有返回的情況下凤覆,讓用戶有數(shù)據(jù)可以看到。收到的網(wǎng)絡(luò)數(shù)據(jù)應(yīng)該是通過(guò)某種方式刷新到界面慈俯,而不是等到數(shù)據(jù)返回才刷新頁(yè)面贴膘。當(dāng)沒(méi)有網(wǎng)絡(luò)數(shù)據(jù)的時(shí)候略号,界面應(yīng)該可以自成一體,走的通流程氛琢,不強(qiáng)依賴網(wǎng)絡(luò)數(shù)據(jù)阳似。

在弱網(wǎng)模式下調(diào)試是我們必備的功力铐伴,因?yàn)槲覀円紤]用戶的實(shí)施環(huán)境通常都不會(huì)很好当宴。把經(jīng)常使用的數(shù)據(jù),存到緩存玲献,提高APP的運(yùn)行效率捌年、界面流程度挂洛。同時(shí),我們需要具備收集奔潰日志的功能托酸,這樣才能更好的減少崩潰,提高用戶體驗(yàn)谷丸。

界面卡頓產(chǎn)生的原因和解決方案

iOS界面處理是在主線程下進(jìn)行的念秧,系統(tǒng)圖形服務(wù)通過(guò) CADisplayLink 等機(jī)制通知 App摊趾,App 主線程開始在 CPU 中計(jì)算顯示內(nèi)容游两,比如視圖的創(chuàng)建、布局計(jì)算肛炮、圖片解碼侨糟、文本繪制等瘩燥。隨后 CPU 會(huì)將計(jì)算好的內(nèi)容提交到 GPU 去,由 GPU 進(jìn)行變換溶耘、合成凳兵、渲染企软。隨后 GPU 會(huì)把渲染結(jié)果提交到幀緩沖區(qū)去,等待下一次刷新信號(hào)到來(lái)時(shí)顯示到屏幕上形庭。顯示器通常以固定頻率進(jìn)行刷新碘勉,如果在一個(gè)刷新時(shí)間內(nèi)桩卵,CPU 或者 GPU 沒(méi)有完成內(nèi)容提交,則那一幀就會(huì)被丟棄胜嗓,等待下一次機(jī)會(huì)再顯示,而這時(shí)顯示屏?xí)A糁暗膬?nèi)容不變怔锌。這就是界面卡頓的原因埃元。CPU 和 GPU 不論哪個(gè)阻礙了顯示流程媚狰,都會(huì)造成掉幀現(xiàn)象。

CPU 造成的資源消耗有以下幾種:

  • 對(duì)象創(chuàng)建
  • 對(duì)象調(diào)整
  • 對(duì)象銷毀
  • 布局計(jì)算
  • Autolayout
  • 文本計(jì)算
  • 文本渲染
  • 圖片的繪制和解碼

GPU 資源消耗有下面幾種情況:

  • 紋理的渲染
  • 視圖的混合 (Composing)
  • 圖形的生成等

具體可以參考這篇文章

用 Instruments 來(lái)檢驗(yàn)?zāi)愕腶pp

時(shí)間事件查看器-Time Profiler
在xcode的菜單中選擇 product->Profile
我們會(huì)看到下面的界面:

Instruments

點(diǎn)擊Time Profiler進(jìn)入。

Time Profiler

下面我們來(lái)深究如下的控制面板:

控制面板

以下介紹下配置選項(xiàng):

  1. Separate by Thread: 每個(gè)線程應(yīng)該分開考慮遗锣。只有這樣你才能揪出那些大量占用CPU的"重"線程精偿。
  2. Invert Call Tree: 從上倒下跟蹤堆棧,這意味著你看到的表中的方法,將已從第0幀開始取樣,這通常你是想要的,只有這樣你才能看到CPU中話費(fèi)時(shí)間最深的方法.也就是說(shuō)FuncA{FunB{FunC}} 勾選此項(xiàng)后堆棧以C->B-A 把調(diào)用層級(jí)最深的C顯示在最外面派殷。
  3. Hide System Libraries: 勾選此項(xiàng)你會(huì)顯示你app的代碼,這是非常有用的. 因?yàn)橥ǔD阒魂P(guān)心cpu花在自己代碼上的時(shí)間不是系統(tǒng)上的毡惜。
  4. Flatten Recursion: 遞歸函數(shù), 每個(gè)堆棧跟蹤一個(gè)條目。
  5. Top Functions: 一個(gè)函數(shù)花費(fèi)的時(shí)間直接在該函數(shù)中的總和扶叉,以及在函數(shù)調(diào)用該函數(shù)所花費(fèi)的時(shí)間的總時(shí)間枣氧。因此垮刹,如果函數(shù)A調(diào)用B,那么A的時(shí)間報(bào)告在A花費(fèi)的時(shí)間加上B.花費(fèi)的時(shí)間,這非常真有用酪劫,因?yàn)樗梢宰屇忝看蜗碌秸{(diào)用堆棧時(shí)挑最大的時(shí)間數(shù)字,歸零在你最耗時(shí)的方法刻剥。

找到Detail面板里最耗時(shí)的進(jìn)程滩字,點(diǎn)擊進(jìn)去可以看到代碼,觀察是否有異漓藕,如此便可逐步優(yōu)化應(yīng)用的運(yùn)行效果了撵术。

修改

修改好后,在儀器重新運(yùn)行該應(yīng)用程序Product—Profile(或?I-記住话瞧,這些快捷鍵真的會(huì)為您節(jié)省一些時(shí)間)交排。
分配工具

分配工具
點(diǎn)擊進(jìn)入

這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)兩個(gè)曲目埃篓。一個(gè)叫(分配)Allocations架专,以及一個(gè)被稱為VM Tracker(虛擬機(jī)跟蹤)玄帕。

內(nèi)存泄漏有兩種泄漏。第一個(gè)是真正的內(nèi)存泄漏委刘,一個(gè)對(duì)象尚未被釋放鹰椒,但是不再被引用的了。因此淆珊,存儲(chǔ)器不能被重新使用施符。第二類泄漏是比較麻煩一些。這就是所謂的“無(wú)界內(nèi)存增長(zhǎng)”操刀。這發(fā)生在內(nèi)存繼續(xù)分配,并永遠(yuǎn)不會(huì)有機(jī)會(huì)被釋放撼嗓。如果永遠(yuǎn)這樣下去你的程序占用的內(nèi)存會(huì)無(wú)限大,當(dāng)超過(guò)一定內(nèi)存的話 會(huì)被系統(tǒng)的看門狗給kill掉且警。

內(nèi)存警告是ios處理app最好的方式礁遣,尤其是在內(nèi)存越來(lái)越吃緊的時(shí)候,你需要清除一些內(nèi)存。內(nèi)存一直增長(zhǎng)其實(shí)也不一定是你的代碼出了問(wèn)題,也有可能是UIKit 系統(tǒng)框架本身導(dǎo)致的杏头。

嘗試

自己動(dòng)手觀察下醇王,一切自然明了崭添。

內(nèi)存泄露
這一類泄漏是前面提到的 - 當(dāng)一個(gè)對(duì)象不再被引用時(shí)出現(xiàn)的那種,檢測(cè)泄漏可以理解為一個(gè)很復(fù)雜的事情呼渣,但泄漏的工具記得已分配的所有對(duì)象,通過(guò)定期掃描每個(gè)對(duì)象以確定是否有任何不能從任何其他對(duì)象訪問(wèn)的焊夸。

關(guān)閉儀器缰犁,回到Xcode和選擇Product->Profile

內(nèi)存泄露

點(diǎn)擊進(jìn)入帅容,運(yùn)行:

運(yùn)行

自己動(dòng)手嘗試下并徘,找到右邊面板里,如果有黑色標(biāo)識(shí)的方法蕴茴,進(jìn)入看看。學(xué)習(xí)就是多嘗試倦淀。

篇幅有限,更多的內(nèi)容我們下次再聊姻成。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末科展,一起剝皮案震驚了整個(gè)濱河市糠雨,隨后出現(xiàn)的幾起案子甘邀,更是在濱河造成了極大的恐慌,老刑警劉巖乎澄,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異解恰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)挟纱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門紊服,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胸竞,“玉大人,你說(shuō)我怎么就攤上這事煎饼⌒3啵” “怎么了筒溃?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵怜奖,是天一觀的道長(zhǎng)烦周。 經(jīng)常有香客問(wèn)我怎顾,道長(zhǎng),這世上最難降的妖魔是什么夭委? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任株灸,我火速辦了婚禮擎值,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屹蚊。我一直安慰自己汹粤,他們只是感情好田晚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布贤徒。 她就那樣靜靜地躺著,像睡著了一般接奈。 火紅的嫁衣襯著肌膚如雪鲫趁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天堡僻,我揣著相機(jī)與錄音,去河邊找鬼硼讽。 笑死固阁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的备燃。 我是一名探鬼主播凌唬,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼况褪!你這毒婦竟也來(lái)了更耻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤食侮,失蹤者是張志新(化名)和其女友劉穎熬北,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巫延,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年地消,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼阔。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婆廊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淘邻,到底是詐尸還是另有隱情,我是刑警寧澤统阿,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布扶平,位于F島的核電站蔬蕊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏袁串。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一餐曼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧源譬,春花似錦孕似、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至藐唠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宇立,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工殴蓬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留染厅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓肖粮,卻偏偏與公主長(zhǎng)得像涩馆,于是被迫代替她去往敵國(guó)和親允坚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,163評(píng)論 25 707
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,392評(píng)論 8 265
  • 意志大餅,思想規(guī)劃展运,行動(dòng)落實(shí)活逆。流膩黏連拗胜,立果分?jǐn)唷?/div>
    bangjieuu閱讀 193評(píng)論 0 0
  • 那些路都糾纏過(guò)水流,可無(wú)論我往哪個(gè)方向行走锈遥,夕陽(yáng)永恒地在前頭勘畔,朝陽(yáng)似死人的臉一直在背后。就算身處鬧市我也感到清幽咖杂,...
    李一十八閱讀 280評(píng)論 0 0
  • 下午的作品
    婭妮妮閱讀 213評(píng)論 0 4