總結(jié):
- 1.盡量減少視圖數(shù)量和層次
- 2.GPU能處理的最大紋理尺寸是4096x4096礁叔,一旦超過這個尺寸,就會占用CPU資源進行處理歇万,所以紋理盡量不要超過這個尺寸
- 3.盡量避免段時間內(nèi)大量圖片的顯示洛姑,盡可能將多張圖片合成一張圖片顯示
- 4.減少透明的視圖(alpha<1),不透明的就設(shè)置opaque為yes
- 5.盡量避免出現(xiàn)離屏渲染
GPU 資源消耗原因和解決方案
相對于 CPU 來說胯努,GPU 能干的事情比較單一:
接收提交的紋理(Texture)和頂點描述(三角形),應(yīng)用變換(transform)逢防、混合并渲染叶沛,然后輸出到屏幕上
。
通常你所能看到的內(nèi)容忘朝,主要也就是紋理(圖片)和形狀(三角模擬的矢量圖形)兩類灰署。
紋理的渲染
所有的 Bitmap,包括圖片辜伟、文本氓侧、柵格化的內(nèi)容脊另,最終都要由內(nèi)存提交到顯存导狡,綁定為 GPU Texture。不論是提交到顯存的過程偎痛,還是 GPU 調(diào)整和渲染 Texture 的過程旱捧,都要消耗不少 GPU 資源。當(dāng)在較短時間顯示大量圖片時(比如 TableView 存在非常多的圖片并且快速滑動時),CPU 占用率很低枚赡,GPU 占用非常高氓癌,界面仍然會掉幀。避免這種情況的方法只能是盡量減少在短時間內(nèi)大量圖片的顯示贫橙,盡可能將多張圖片合成為一張進行顯示贪婉。
當(dāng)圖片過大,超過 GPU 的最大紋理尺寸時卢肃,圖片需要先由 CPU 進行預(yù)處理疲迂,這對 CPU 和 GPU 都會帶來額外的資源消耗。目前來說莫湘,iPhone 4S 以上機型尤蒿,紋理尺寸上限都是 4096×4096,更詳細(xì)的資料可以看這里:iosres.com幅垮。所以腰池,盡量不要讓圖片和視圖的大小超過這個值。
視圖的混合 (Composing)
當(dāng)多個視圖(或者說 CALayer)重疊在一起顯示時忙芒,GPU 會首先把他們混合到一起示弓。如果視圖結(jié)構(gòu)過于復(fù)雜,混合的過程也會消耗很多 GPU 資源匕争。為了減輕這種情況的 GPU 消耗避乏,應(yīng)用應(yīng)當(dāng)盡量減少視圖數(shù)量和層次,并在不透明的視圖里標(biāo)明 opaque 屬性以避免無用的 Alpha 通道合成甘桑。當(dāng)然拍皮,這也可以用上面的方法,把多個視圖預(yù)先渲染為一張圖片來顯示跑杭。
圖形的生成
CALayer 的 border铆帽、圓角、陰影德谅、遮罩(mask)爹橱,CASharpLayer 的矢量圖形顯示,通常會觸發(fā)離屏渲染(offscreen rendering)窄做,而離屏渲染通常發(fā)生在 GPU 中愧驱。當(dāng)一個列表視圖中出現(xiàn)大量圓角的 CALayer,并且快速滑動時椭盏,可以觀察到 GPU 資源已經(jīng)占滿组砚,而 CPU 資源消耗很少。這時界面仍然能正程图眨滑動糟红,但平均幀數(shù)會降到很低艾帐。為了避免這種情況,可以嘗試開啟 CALayer.shouldRasterize 屬性盆偿,但這會把原本離屏渲染的操作轉(zhuǎn)嫁到 CPU 上去柒爸。對于只需要圓角的某些場合,也可以用一張已經(jīng)繪制好的圓角圖片覆蓋到原本視圖上面來模擬相同的視覺效果事扭。最徹底的解決辦法捎稚,就是把需要顯示的圖形在后臺線程繪制為圖片,避免使用圓角求橄、陰影阳藻、遮罩等屬性。