1. 界面卡頓的原因。主要從兩個(gè)角度考慮,cpu限制—》對象的創(chuàng)建,釋放,屬性調(diào)整,CALayer的屬性調(diào)整的時(shí)候是會(huì)創(chuàng)建隱士動(dòng)畫,是比較損耗性能的;視圖和文本的布局計(jì)算,AutoLayout的布局計(jì)算都是在主線程上的,所以占用CPU時(shí)間也很多;文本渲染如UILable和UITextView都是在主線程渲染的;圖片的解碼,通常UIImage只有在交給GPU之前的一瞬間,CPU才會(huì)對其解碼。GPU限制—》視圖的混合,比如一個(gè)界面十幾層的視圖疊加到一起,GPU不得不計(jì)算每個(gè)像素點(diǎn)要顯示的像素;離屏渲染如視圖的Mask,圓角,陰影。半透明,GPU不得不進(jìn)行數(shù)學(xué)計(jì)算,如果是不透明的,cpu只需取上層的就可以了;浮點(diǎn)數(shù)像素
2. 界面顯示的原理:iOS設(shè)備通常是60fps(每秒60幀),也就是說兩幀相隔的時(shí)間是1/60秒。大概16.7ms。為了顯示一幀,需要如下工作:*CPU計(jì)算好各個(gè)視圖的位置,大小,對圖片進(jìn)行解碼等,繪制成紋理交給GPU, ? *GPU對收到的紋理進(jìn)行混合,頂點(diǎn)變換,渲染到幀緩沖區(qū),每16.7ms,一個(gè)時(shí)鐘信號(hào)到達(dá),幀緩沖區(qū)取出一幀,顯示到屏幕。也就是說,CPU或者GPU被大量占用的時(shí)候,都有可能在16.7ms中沒法辦法完成一幀的繪制,導(dǎo)致信號(hào)到來的時(shí)候,取得還是上一幀的內(nèi)容,也就都有可能導(dǎo)致界面卡頓。
3. 離屏渲染:在iOS中,渲染通常分為CPU和GPU渲染兩種,而GPU渲染又分為在GPU緩沖區(qū)和非GPU緩沖區(qū)兩種。*CPU渲染(軟件渲染),CPU繪制成bitmap,交給GPU。 *GPU渲染(硬件渲染)—》GPU緩沖區(qū)渲染和非GPU緩沖區(qū)渲染(額外開辟緩沖區(qū))。通常CPU渲染和GPU非幀緩沖區(qū)渲染統(tǒng)稱為離屏渲染。CPU和幀緩沖區(qū)是為了圖形圖像顯示做了高度優(yōu)化的,速度較快。
4. 什么情況下會(huì)觸發(fā)離屏渲染? *用CoreGraphics的CGContext繪制的 ? *在drawRect中繪制的,即使drawRect是空的 ?*Layer具有Mask(比如圓角)或者shadow ? *Layer的隔柵化shouldRasterize為True,文本(UILable,UITextField,UITextView,CoreText,UITextLayer)
5. 離屏渲染一定會(huì)引起性能問題嗎?
很少會(huì),比如drawRect這個(gè)方法,只會(huì)在視圖進(jìn)行重新繪制的時(shí)候才會(huì)調(diào)用,
6.參考鏈接:http://aes.jypc.org/?p=17291
6. Core Animation鏈接:https://zsisme.gitbooks.io/ios-/content/chapter12/instruments.html