目標(biāo):
1.要達(dá)到什么樣的流暢度(FPS達(dá)到60為優(yōu)秀) FPS:1秒渲染多少幀
2.應(yīng)用內(nèi)存降到一個(gè)具體數(shù)字
方案: 可以通過(guò)兩個(gè)的緯度考慮性能優(yōu)化
CPU與GPU資源消耗原因以及解決辦法
CPU:加載對(duì)圖文布局
加載資源冠蒋,對(duì)象創(chuàng)建婴梧,對(duì)象調(diào)整呻袭,對(duì)象銷(xiāo)毀纵朋,圖片解碼,圖片繪制,文本計(jì)算,文本渲染擎淤,布局計(jì)算,布局Autolayout
GPU:文視圖
紋理渲染秸仙,視圖混合嘴拢,圖形形成(三角,遮罩)
GPU的渲染性能比CPU高效很多寂纪,同時(shí)對(duì)系統(tǒng)的負(fù)載和消耗更低一些席吴,所以,我們應(yīng)該盡量讓CPU負(fù)責(zé)主線程UI調(diào)動(dòng)捞蛋,圖形顯示相關(guān)工作交給GPU
軟件性能優(yōu)化:啟動(dòng)內(nèi)存管理:4避免孝冒,3圖片,NSAutoreleasepool/coreText ,網(wǎng)絡(luò)優(yōu)化
1.啟動(dòng)優(yōu)化
2.內(nèi)存管理
使用ARC,避免循環(huán)引用拟杉,CoreAnimation對(duì)象手動(dòng)釋放
3.避免主線程阻塞
永遠(yuǎn)不要使主線程承擔(dān)過(guò)多
阻礙主進(jìn)程的情形:1.網(wǎng)絡(luò)同步請(qǐng)求2.I/0操作:讀寫(xiě)外部資源3.大量運(yùn)算4.解壓縮
4.避免過(guò)于龐大的XIB
5.避免使用透明視圖
透明對(duì)性能要求較高
6.避免離屏渲染
離屏渲染庄涡,指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開(kāi)辟一個(gè)緩沖區(qū)進(jìn)行渲染操作。離屏渲染意味著你App的部分區(qū)域每一幀渲染了兩次搬设。所以會(huì)造成一定的性能損失穴店。
7.圖片的處理
通常會(huì)用imageNamed:來(lái)加載mainbundle中的圖片,此函數(shù)會(huì)緩存加載的image焕梅。因此,對(duì)于那些被重用的圖片卦洽,這個(gè)API很高效贞言。但是對(duì)于那些使用很少的圖片,用這個(gè)就很耗內(nèi)存阀蒂。
使用一次的應(yīng)用圖片時(shí)使用initWithContentsOfFile:函數(shù)该窗,加載多次使用的圖片時(shí)就使用imageNamed:函數(shù)弟蚀。?
8.在Imageview中調(diào)整圖片大小:
1. 如果要在UIImageview中顯示本地資源圖片,盡量保持大小一致酗失,運(yùn)行中縮放圖片很消耗資源
2.如果圖片是從遠(yuǎn)端服務(wù)加載的不能控制圖片大小义钉,最好縮放一次,然后在UIImageView中使用縮放后的圖片
9.使用緩存/SDWebImage與Cache
因?yàn)閿?shù)據(jù)具有時(shí)效的规肴,所以對(duì)于時(shí)效性要求不高的數(shù)據(jù)完全可以使用緩存來(lái)保證快速顯示捶闸。例如URL對(duì)應(yīng)的圖片緩存(SDWebImage),通過(guò)數(shù)據(jù)庫(kù)活core Data來(lái)保存不需要變動(dòng)的數(shù)據(jù)拖刃,UIWeb的緩存等都屬于這種
10.NSAutoreleasepool
在臨時(shí)創(chuàng)建大量對(duì)象時(shí)删壮,使用NSAutoreleasepool,例如兑牡,一個(gè)循環(huán)用于創(chuàng)建包含多個(gè)對(duì)象的數(shù)組央碟,在循環(huán)體內(nèi),即可使用@autoreleasepool包裹創(chuàng)建代碼均函。使用系統(tǒng)的@autoreleasepool會(huì)有延遲亿虽,內(nèi)存不會(huì)馬上釋放。
11.CoreText
對(duì)于排版復(fù)雜的文字或者圖文混排苞也,使用CoreText技術(shù)?
12.減少Layer與視圖層級(jí)
減少視圖或者layer的層級(jí)數(shù)量洛勉,在有多個(gè)層級(jí)時(shí),可以將多圖合并成一張圖墩朦,再渲染顯示坯认。
13.重用一些高消耗的對(duì)象
如NSDateFormatter、NSCalender等氓涣。解決方法:可以將其作為property牛哺、甚至是靜態(tài)變量作為單例在APP中使用。并且劳吠,NSDateFormatter的 setDateFormate也是非常消耗資源的一個(gè)操作引润。網(wǎng)絡(luò)傳輸過(guò)來(lái)的數(shù)據(jù),往往是json或xml字符串痒玩。直接將這些字符串轉(zhuǎn)換成我們需要的數(shù)據(jù)結(jié)構(gòu)(自定義類或者NSDictionary),避免后續(xù)使用的時(shí)候還要做數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換產(chǎn)生不必要的消耗淳附。
14.關(guān)于后臺(tái)運(yùn)行
進(jìn)入后臺(tái)后,即盡量減少內(nèi)存占用蠢古、釋放所有的共享資源(如Calender或address book)奴曙,因?yàn)閕OS會(huì)kill后臺(tái)中內(nèi)存消耗最多的或者進(jìn)入后臺(tái)還占用共享資源的進(jìn)程。
15.網(wǎng)絡(luò)性能
網(wǎng)絡(luò)性能優(yōu)化涉及到DNS解析草讶,路由算法洽糟,以及服務(wù)器端性能
移動(dòng)網(wǎng)絡(luò)優(yōu)化三要素
16.網(wǎng)絡(luò)
1. Socket: 熟悉TCP/IP協(xié)議族,定義了主機(jī)如何連入因特網(wǎng)及數(shù)據(jù)束河在他們之間傳輸
? ? ? ? 應(yīng)用層: HTTP? SNMP? FTP? NDS
? ? ? ? 傳輸層: TCP UDP
? ? ? ? 網(wǎng)絡(luò)層: IP
? ? 1.Socket描述了一個(gè)IP, 端口對(duì)。它簡(jiǎn)化了程序的操作坤溃,知道對(duì)方的IP以及PORT就可以給對(duì)方發(fā)送消息拍霜,再由服務(wù)器來(lái)處理發(fā)送的這些消息。所以薪介,socket一定包含了通信的雙發(fā)祠饺,即客戶端(Client)與服務(wù)器(server).
? ? ? a: 服務(wù)端利用socket監(jiān)聽(tīng)端口
? ? ? b: 客戶端發(fā)起連接
? ? ? c: 服務(wù)端返回信息,建立連接汁政,開(kāi)始通信
? ? ? d: 客戶端道偷,服務(wù)端斷開(kāi)連接
? ? 2.套接字(socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本單元烂完;
? ? ? ? 應(yīng)用層通過(guò)傳輸層進(jìn)行數(shù)據(jù)通信時(shí)试疙,TCP會(huì)遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的進(jìn)程。
? ? ? ? 多個(gè)TCP連接或者多個(gè)應(yīng)用程序進(jìn)程可能需要通過(guò)同一個(gè)TCP協(xié)議端口傳輸數(shù)據(jù)抠蚣,為了區(qū)分不同的應(yīng)用程序進(jìn)程或連接
? ? ? ? 許多計(jì)算機(jī)系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(socket)接口祝旷,應(yīng)用層和傳輸層通過(guò)socket接口,區(qū)分來(lái)自不同應(yīng)用程序或者網(wǎng)絡(luò)連接的通信嘶窄,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)怀跛;
? ? 3. 建立socket連接至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶端(Clientsocket),另一個(gè)運(yùn)行于服務(wù)器端(Serversocket);
? ? ? ? 套接字之間的連接分為三個(gè)步驟:服務(wù)器監(jiān)聽(tīng)? 客戶端請(qǐng)求? 連接確認(rèn)柄冲。
? ? 4.創(chuàng)建Socket連接時(shí)吻谋,可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP)现横,當(dāng)使用TCP協(xié)議進(jìn)行連接時(shí)漓拾,該Socket連接就是一個(gè)TCP連接。
五戒祠、產(chǎn)生死鎖的四個(gè)條件
1.互斥條件 2.占有等待 3.不可強(qiáng)行占有 4.循環(huán)等待
六骇两、擁塞控制
?某段時(shí)間,對(duì)網(wǎng)絡(luò)中資源需求大于可用的造成擁塞
解決方案
1.慢開(kāi)始:最初TCP建立連接后向網(wǎng)絡(luò)發(fā)送大量數(shù)據(jù)包姜盈,很容易導(dǎo)致網(wǎng)絡(luò)中路由器緩存空間耗盡
2.擁塞避免:每次訪問(wèn)結(jié)束讓CWND增加一個(gè)低千,而不是一倍,增加的更加緩慢
3.快重傳與快恢復(fù)算法