前言
性能優(yōu)化的一個(gè)指標(biāo)就是FPS,F(xiàn)rame Per Seconds,其實(shí)就是屏幕刷新率。蘋果推薦的為60Hz阿逃,也就是說GPU每秒刷新屏幕60次,沒刷新一次就是一個(gè)幀F(xiàn)rame赃蛛。
靜止不動(dòng)的頁面FPS為0恃锉,這個(gè)沒有參考價(jià)值,只有當(dāng)頁面執(zhí)行動(dòng)畫或滑動(dòng)的時(shí)候焊虏,F(xiàn)PS才有參考價(jià)值淡喜。低于FPS低于45的時(shí)候,會(huì)感受到卡頓诵闭。
產(chǎn)生的主要原因
1,GPU產(chǎn)生離屏渲染的主要原因是CALayer使用了圓角,陰影,遮蓋,或圖層不透明等屬性的時(shí)候,圖層屬性的混合體在未預(yù)合成之前是不能直接在屏幕上渲染,其過程需要離屏渲染.
2,實(shí)際項(xiàng)目中CPU產(chǎn)生離屏渲染的的主要原因是Core Graphics API
的使用導(dǎo)致的
注意點(diǎn):
1炼团,需要真機(jī)調(diào)試。
2疏尿,最好使用release的包瘟芝,蘋果針對release包做了很多優(yōu)化,release的包才最終體現(xiàn)性能褥琐。
一锌俱,圖層混合(color blended layer)
1,設(shè)置opaque = true敌呈,這樣的話GPU不用浪費(fèi)資源去計(jì)算透明混合的顏色贸宏。
2造寝,給View設(shè)置一個(gè)不透明的顏色,如果沒有特殊要求設(shè)置為白色即可
二吭练,離屏渲染(Color offScreen-Render)
離屏渲染Color offscreen Rendering 指的是GPU在當(dāng)前屏幕緩沖區(qū)再另外開辟一個(gè)緩沖區(qū)來進(jìn)行渲染操作诫龙。
當(dāng)前屏幕渲染onScreen Rendering,指的是GPU的渲染操作是在當(dāng)前的屏幕緩沖區(qū)進(jìn)行的鲫咽。
離屏渲染會(huì)先在屏幕外創(chuàng)建緩沖區(qū)签赃,渲染結(jié)束后,再從離屏切換到當(dāng)前的屏幕操作分尸,切換上下文的操作是非常消耗性能的锦聊。實(shí)際開發(fā)中要盡量的避免離屏渲染。
觸發(fā)離屏渲染的操作
1,drawRect的方法
2,layer.shadow
3,layer.allowGroupOpacity 或者 layer.allowEdgeAntialiasing
4,layer.shouldResterize
5,layer.mask
6,layer.maskToBounds && layer.cornerRadius
第六點(diǎn),特別要注意的一個(gè)地方是,設(shè)置圓角會(huì)觸發(fā)離屏渲染
解決辦法
1,陰影揮之shadow,用shadowPath來繪制代替shadowOffset等屬性的設(shè)置.
view.layer.shadowPath = [UIBezierPath pathWithCGRect: view.bounds].CGPath
2,圓角GraphicContext生成帶圓角的圖片或View(png圖片在iOS9之后不會(huì)觸發(fā)離屏渲染.
UIGraphicsBeginImageContext(self.size);
// 獲得上下文
CGContextRef context = UIGraphicsGetCurrentContext();
// 矩形框
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
// 畫一個(gè)圓
CGContextAddEllipseInRect(context, rect);
// 裁剪成上面畫的圖形形狀
CGContextClip(context);
// 將image繪制到剛才的圓形上
// UIImage *image = [UIImage imageNamed:@"1.jpg"];
// [image drawInRect:rect];
[self drawInRect:rect];
// 獲得上下文的圖片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();