此時(shí)此刻玻璃杯 碎了 歲歲平安务豺。。。。開啟自我之旅
對(duì)于uitableview 優(yōu)化 有研究
第一點(diǎn)是cell identifier 復(fù)用
第二點(diǎn) 對(duì)于各cell不同 高度的計(jì)算 rowHeight 的設(shè)置 以及 estimatedRowHeight (估算高度的開啟)
第三點(diǎn) ios8以后 self-sizing cell ((( 旨在讓 cell 自己負(fù)責(zé)自己的高度計(jì)算切省,使用 frame layout 和 auto layout 都可以享受到)))
具有動(dòng)態(tài)內(nèi)容的cell
frame時(shí)代通過數(shù)據(jù) 反算高度(吐槽 各種margin 并且耦合了屏幕的寬度等)
AutoLayout 提供systemLayoutSizeFittingSizeAPI 在 contentView 中設(shè)置約束后,就能計(jì)算出準(zhǔn)確的值杈抢。
第四點(diǎn) rowHeight 的與緩存機(jī)制
采用的Runloop 利用runloop 空閑時(shí) 執(zhí)行緩存任務(wù)(當(dāng)用戶正在滑動(dòng)列表時(shí)顯然不應(yīng)該執(zhí)行計(jì)算任務(wù)影響滑動(dòng)體驗(yàn))
RunLoopMode 的概念
UITrackingRunLoopMode 接受滑動(dòng)手勢和處理滑動(dòng)事件(包括減速和彈簧效果)
NSDefaultRunLoopModel (一進(jìn)入程序就進(jìn)入這個(gè) 狀態(tài)) 默認(rèn)狀態(tài) 空閑狀態(tài)
NSRunLoopCommonModes (以上兩種結(jié)合)
NSTimer 完全依賴RunLoop工作
tableview 延遲加載圖片思路 在NSDefaultRunLoopModel 時(shí)設(shè)置圖片 防止卡頓。delegate 監(jiān)聽滑動(dòng)的時(shí)候不去設(shè)置仑性。
對(duì)于UIKite性能調(diào)優(yōu)
common + I 打開 Instrument 選擇
core animation
==圖層混合 調(diào)試項(xiàng)Color Blended Layers 很多控件opaque設(shè)置為yes(默認(rèn)為yes) 目的就是避免圖層混合惶楼。 關(guān)注圖像本身的性質(zhì).
透明會(huì)出現(xiàn) 圖層混合 如果不設(shè)置backgroundColor 控件依然被認(rèn)為透明。
===光柵化 調(diào)試選項(xiàng) Color Hits Green and Misses Red(光柵化是將一個(gè)layer預(yù)先渲染成位圖(bitmap)诊杆,然后加入緩存中)在緩存中是綠色歼捐。提高性能。 緩存有效期問題(100ms)
用不用晨汹?
光柵化的緩存機(jī)制是一把雙刃劍豹储,先寫入緩存再讀取有可能消耗較多的時(shí)間。因此光柵化僅適用于較復(fù)雜的淘这、靜態(tài)的效果剥扣。通過Instrument的調(diào)試發(fā)現(xiàn)巩剖,這里使用光柵化經(jīng)常出現(xiàn)未命中緩存的情況,如果沒有特殊需要?jiǎng)t可以關(guān)閉光柵化钠怯,所以我們做的第二個(gè)優(yōu)化是注釋掉下面這行代碼:
光柵化會(huì)導(dǎo)致離屏渲染
===顏色格式 調(diào)試選項(xiàng) Color Copied Images
- 把圖片從PNG或JPEG等格式中解壓出來佳魔,得到像素?cái)?shù)據(jù)
- 如果GPU不支持這種顏色各式,CPU需要進(jìn)行格式轉(zhuǎn)換
比如應(yīng)用中有一些從網(wǎng)絡(luò)下載的圖片晦炊,而GPU恰好不支持這個(gè)格式鞠鲜,這就需要CPU預(yù)先進(jìn)行格式轉(zhuǎn)化。第三個(gè)選項(xiàng)“Color Copied Images”就用來檢測這種實(shí)時(shí)的格式轉(zhuǎn)化断国,如果有則會(huì)將圖片標(biāo)記為藍(lán)色贤姆。
===圖片的大小 調(diào)試選項(xiàng) Color Misaligned Images
在demo中,每個(gè)UIImageView
的大小都是180x180稳衬,而只有第二張圖片的像素大小是360x360霞捡。因此除了第二張圖片,其他的圖片都需要被縮放宋彼。圖片的縮放需要占用時(shí)間弄砍,因此我們要盡可能保證無論是本地圖片還是從網(wǎng)絡(luò)或取得圖片的大小,都與其frame保持一致
第三個(gè)優(yōu)化是調(diào)整所有圖片的像素大小以避免不必要的縮放输涕。
====離屏渲染 調(diào)試選項(xiàng) Color Offscreen-Rendered Yellow
首先音婶,OpenGL提交一個(gè)命令到Command Buffer,隨后GPU開始渲染莱坎,渲染結(jié)果放到Render Buffer中衣式,這是正常的渲染流程。但是有一些復(fù)雜的效果無法直接渲染出結(jié)果檐什,它需要分步渲染最后再組合起來碴卧,比如添加一個(gè)蒙版(mask):
在前兩個(gè)渲染通道中,GPU分別得到了紋理(texture乃正,也就是那個(gè)相機(jī)圖標(biāo))和layer(藍(lán)色的蒙版)的渲染結(jié)果住册。但這兩個(gè)渲染結(jié)果沒有直接放入Render Buffer中,也就表示這是離屏渲染瓮具。直到第三個(gè)渲染通道荧飞,才把兩者組合起來放入Render Buffer中。離屏渲染意味著把渲染結(jié)果臨時(shí)保存名党,等用到時(shí)再取出叹阔,因此相對(duì)于普通渲染更占用資源。
引起離屏渲染===
- 重寫drawRect方法
- 有mask或者是陰影(layer.masksToBounds, layer.shadow*)传睹,模糊效果也是一種mask
- layer.shouldRasterize = true
常見問題設(shè)置圓角 cornerRadius 其中 layer.masksToBounds = true 會(huì)引起光柵化耳幢。。避免滑動(dòng)時(shí)必須設(shè)置圓角的化 采用光柵化 緩存圓角欧啤。
同時(shí)對(duì)于圓角圖片的裁剪 貝塞爾曲線 畫出來睛藻。启上。UIBezierPath 設(shè)置裁剪路徑。