1.什么是離屏渲染胡岔?
2.離屏渲染會引起什么問題?
3.什么情況下會發(fā)生離屏渲染歹袁?
1.什么是離屏渲染
? ? ? ? 離屏渲染是GPU在當前幀緩沖(frame buffer)區(qū)之外新開辟了一塊內(nèi)存區(qū)坷衍,將渲染結果先暫存到此區(qū)域內(nèi),渲染完成后在寫入當前的frame buffer条舔。
2.離屏渲染會引起什么問題枫耳?
? ? ? ? 離屏渲染會降低App的性能,蘋果手機屏幕刷新率是每秒60次孟抗,每一幀渲染的時間是16.67ms迁杨,也就是說在這16.67ms內(nèi)要完成一幀的渲染,如果完不成就會掉幀凄硼,我們看到的屏幕的現(xiàn)象就是卡頓铅协,而離屏渲染需要另外開辟內(nèi)存,并且GPU會從當前frame buffer切換到offscreen buffer摊沉,offscreen buffer渲染結束后再切換回來將結果顯示到屏幕上狐史,如果cell上有離屏渲染,那么滑動的時候每一幀都會切換,每秒要切換60次骏全,可想而知內(nèi)存消耗比正常渲染大多少苍柏。
3.什么情況下會發(fā)生離屏渲染?
? ? ? ? 1.設置圓角:這種情況不是必然會發(fā)生離屏渲染的,如果單純的設置UIView的layer.cornerRadius+layer.masksToBounds是不會發(fā)生離屏渲染的吟温,UIImageView如果有image序仙,UIButton有背景圖時突颊,設置圓角并且圖片也需要切圓角時就會發(fā)生離屏渲染鲁豪。
? ? ? ? 2.設置shadow
? ? ? ? 3.設置group opacity
? ? ? ? 4.mask
? ? ? ? 5.UIBlurEffect
總結:發(fā)生離屏渲染是GPU在當前屏幕無法渲染完成,只能另外開辟緩沖區(qū)來暫存渲染結果律秃,最后在返回frame buffer 顯示爬橡。GPU為什么無法在frame buffer 渲染呢?因為GPU渲染類似畫家畫畫棒动,一層一層渲染糙申,先渲染底層,再渲染上層船惨,并且每渲染完一幀柜裸,就會把此幀數(shù)據(jù)刪除來減少緩沖區(qū)的占用,這樣如果渲染完上層后需要修改底層的內(nèi)容粱锐,這時就無法獲取數(shù)據(jù)疙挺,就無法完成渲染,所以才需要額外開辟緩沖區(qū)來進行組合渲染怜浅。