不改一行代碼吁脱,就極大提高對(duì)本地圖片加載速度(對(duì) Asset 的探討)

2017年8月4日更新

根據(jù)這個(gè) Session Optimizing I/O for Performance and Battery Life 的描述蚯根,使用 Asset 還有對(duì)啟動(dòng)優(yōu)化的好處谱净。

Asset Catalogs

10%的速度提升

如果你是被標(biāo)題吸引進(jìn)來的

可以直接跳到最后看結(jié)論仅政,接下來是對(duì) Asset 為什么能加快對(duì)本地圖片加載速度的探討。

為什么探討 Asset 這個(gè)東西

由于項(xiàng)目中在剛啟動(dòng)的瞬間使用 "-[UIImage imageNamed:]" 會(huì)很慢静汤,所以就打算探討 "-[UIImage imageNamed:]" 的實(shí)現(xiàn)琅催,但是過程中發(fā)現(xiàn)了使用 Asset 對(duì)于圖片的加載有極大的提升,就去探討 Asset 了虫给。

使用 Time Profiler 探索實(shí)現(xiàn)

在使用 Time Profiler 調(diào)試 "-[UIImage imageNamed:]" 時(shí)候藤抡,發(fā)現(xiàn)它實(shí)際是調(diào)用 "-[UIImage imageNamed:inBundle:compatibleWithTraitCollection:]" 的,這時(shí)候萌發(fā)了一個(gè)想法是會(huì)不會(huì)根據(jù)指定 Bundle 的范圍會(huì)加快加載圖片的速度(理由是文件夾小了抹估,減少索引次數(shù))缠黍。

實(shí)驗(yàn)后發(fā)現(xiàn),果然如此棋蚌。把圖片分散到指定 bundle 后的速度大大提升了嫁佳。

這時(shí)候,有同事提示我使用 Asset 會(huì)不會(huì)加快谷暮,因?yàn)?WWDC 有提到過蒿往。所以我就去看了這集 Session,發(fā)現(xiàn)它是這樣描述的湿弦。

發(fā)現(xiàn)使用 Asset 后速度也大大提升瓤漏。到此為止就產(chǎn)生了探討 Asset 這個(gè)東西的需求了。

符號(hào)斷點(diǎn)跟蹤步驟

這里就用兩個(gè)圖片來簡(jiǎn)單描述 "-[UIImage imageNamed:]" 發(fā)生了什么颊埃?

左圖 Aseet/ 右圖 Folder
上圖 Aseet/ 下圖 Folder

使用 Asset 底層是使用一個(gè)叫 _UIAssetManager 的類去存取圖片蔬充,而使用 Folder 則是走 imageIO。而且即使你是用 Folder 也會(huì)先判斷 Asset 中沒有這張圖片才去走 imageIO 班利。

這里就不展開說饥漫,具體可以根據(jù)圖中的函數(shù)名下符號(hào)斷點(diǎn)跟蹤。(建議使用 chisel 來看各個(gè)類的成員變量)

緩存結(jié)構(gòu)和索引的不同

使用 Asset 的緩存結(jié)構(gòu)是: CUIStructuredThemeStore(https://github.com/billinghamj/iPhone6-iOS8-RuntimeHeaders/blob/master/PrivateFrameworks/CoreUI.framework/CUIStructuredThemeStore.h)

// _cache
[
Hash(A.png) -> 緩存
Hash(B.png) -> 緩存
]

使用 Folder 的緩存結(jié)構(gòu)是: CUIMutableStructuredThemeStore(https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/PrivateFrameworks/CoreUI.framework/CUIMutableStructuredThemeStore.h)

// nameIdentifierStore
[
A.png -> 1
B.png -> 2
]

// memoryStore
[
Hash_(1) -> 緩存
Hash_(2) -> 緩存
]

因?yàn)槭褂?Folder 去查找緩存罗标,會(huì)先遍歷 nameIdentifierStore 查找是否有緩存庸队,沒有就從 Folder 讀取。在 Time Profiler 會(huì)有那么多的 "isEqualTo" 比較闯割。

而使用 Asset 則是直接根據(jù)圖片名稱來直接 "objectForKey:" 取出緩存彻消。

兩者速度比較是: 前者 O(n)+O(1),后者 O(1)。
(至于為什么是O(n)? 因?yàn)槲矣^察有O(n)這個(gè)行為宙拉,且 "isEqualTo" 的參數(shù)剛好字典 keys 和當(dāng)前需要圖片的名字宾尚。)

而且看出來建立這個(gè)緩存的時(shí)候,使用 Asset 會(huì)快一點(diǎn)(只需要一個(gè)字典就可以)谢澈。

文件 IO 的不同

假設(shè)都是讀取 5 張圖片

使用 Asset 的 IO 過程是:
open Asset -> read Asset -> close Asset

使用 Folder 的過程是:
open 1.png -> read 1.png -> close 1.png
open 2.png -> read 2.png -> close 2.png
open 3.png -> read 3.png -> close 3.png
open 4.png -> read 4.png -> close 4.png
open 5.png -> read 5.png -> close 5.png

可以看出這里 IO 次數(shù)少了(如果數(shù)量大的話煌贴,比較更加明顯御板,Asset 一直是 1 次IO,而 Folder 會(huì)隨讀取文件的多少而遞增)崔步,而且在 IO Usage 可以看出讀取 Asset 的速度極快稳吮。

asset.car 到底是什么

asset.car 是編譯后打包到項(xiàng)目里的文件。從目前的研究來看井濒,asset.car 其實(shí)是將資源打包并建立索引的二進(jìn)制文件,其頭部包含資源在二進(jìn)制對(duì)應(yīng)的位置(類似 seekTable)列林。

小結(jié)

所以使用 Asset 的速度快的原因有以下幾點(diǎn):

  1. 緩存格式較優(yōu)瑞你,從而建立和查找緩存的速度也會(huì)加快。
  2. 圖片儲(chǔ)存方式較優(yōu)希痴,查找圖片位置更快者甲,IO 也更快。

從 Folder 到 Asset砌创,你需要做的只是轉(zhuǎn)移圖片資源(Xcode支持將Folder圖片一鍵導(dǎo)入)虏缸,并且不需要改任何代碼就能使圖片加載速度大大加快。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫩实,一起剝皮案震驚了整個(gè)濱河市刽辙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甲献,老刑警劉巖宰缤,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晃洒,居然都是意外死亡慨灭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門球及,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氧骤,“玉大人,你說我怎么就攤上這事吃引〕锪辏” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵际歼,是天一觀的道長(zhǎng)惶翻。 經(jīng)常有香客問我,道長(zhǎng)鹅心,這世上最難降的妖魔是什么吕粗? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮旭愧,結(jié)果婚禮上颅筋,老公的妹妹穿的比我還像新娘宙暇。我一直安慰自己,他們只是感情好议泵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布占贫。 她就那樣靜靜地躺著,像睡著了一般先口。 火紅的嫁衣襯著肌膚如雪型奥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天碉京,我揣著相機(jī)與錄音厢汹,去河邊找鬼。 笑死谐宙,一個(gè)胖子當(dāng)著我的面吹牛烫葬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凡蜻,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼搭综,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了划栓?” 一聲冷哼從身側(cè)響起兑巾,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茅姜,沒想到半個(gè)月后闪朱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钻洒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年奋姿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片素标。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡称诗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出头遭,到底是詐尸還是另有隱情寓免,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布计维,位于F島的核電站袜香,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鲫惶。R本人自食惡果不足惜蜈首,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧欢策,春花似錦吆寨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俺孙,卻和暖如春辣卒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睛榄。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工添寺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懈费。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像博脑,于是被迫代替她去往敵國(guó)和親憎乙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理叉趣,服務(wù)發(fā)現(xiàn)泞边,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 在第13章“高效繪圖”中疗杉,我們研究了和Core Graphics繪圖相關(guān)的性能問題阵谚,以及如何修復(fù)。和繪圖性能相關(guān)緊...
    雪_晟閱讀 622評(píng)論 0 0
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果烟具,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜梢什,今天將帶大家一窺iOS動(dòng)畫全貌。在這里你可以看...
    F麥子閱讀 5,094評(píng)論 5 13
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程朝聋,因...
    小菜c閱讀 6,358評(píng)論 0 17