成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS和常見的離屏渲染Say Goodbye!

移動開發
移動應用優化到最后主要還是看FPS(頁面流暢程度)性能、內存占用等方面。離屏渲染也是老生常談的一個問題,本文側重點在常見導致離屏渲染的因素及解決方案。

移動應用優化到***主要還是看FPS(頁面流暢程度)性能、內存占用等方面。離屏渲染也是老生常談的一個問題,本文側重點在常見導致離屏渲染的因素及解決方案。

那么為什么離屏渲染會引起性能問題?

OpenGL中,GPU屏幕渲染有兩種方式: On-Screen Rendering (當前屏幕渲染) 和 Off-Screen Rendering (離屏渲染) ,當前屏幕渲染不需要額外創建新的緩存,也不需要開啟新的上下文,相對于離屏渲染性能更好。但是受當前屏幕渲染的局限因素限制(只有自身上下文、屏幕緩存有限等),當前屏幕渲染有些情況下的渲染解決不了的,就使用到離屏渲染。離屏渲染的整個過程需要切換上下文環境,先從 當前屏幕切換到離屏,等結束后,又要將上下文環境切換回來.這也是為什么會消耗性能的原因了。  

[[214033]]

離屏渲染引發因素有 cornerRadius(設置圓角)、shadows(陰影)、masks(遮罩)、edge antialiasing(抗鋸齒)、group opacity(不透明)、shouldRasterize(光柵化) 等,至于檢測離屏渲染的工具 Instruments的Core Animation 就不多說了。本文主要介紹 設置圓角 和 陰影 的方案。

設置圓角

常規做法: 

  1. //只需要設置layer層的兩個屬性 
  2.    //設置圓角 
  3.    imageView.layer.cornerRadius = imageView.frame.size.width / 2; 
  4.    //將多余的部分切掉 
  5.    imageView.layer.masksToBounds = YES; 

這里提供兩種避免離屏渲染的方案

1.視圖上添加一個子layer到最上層,用于遮蓋該視圖及其子視圖,設置layer的圖片為剛好能夠遮蓋成所需圓角樣子,并且圖片顏色剛好是該視圖父視圖的背景顏色就達到想要的效果。

github地址 

  1. /** 
  2.  設置一個四角圓角 
  3.  
  4.  @param radius 圓角半徑 
  5.  @param color  圓角背景色 
  6.  */ 
  7. - (void)xw_roundedCornerWithRadius:(CGFloat)radius cornerColor:(UIColor *)color; 
  8.  
  9. /** 
  10.  設置一個普通圓角 
  11.  
  12.  @param radius  圓角半徑 
  13.  @param color   圓角背景色 
  14.  @param corners 圓角位置 
  15.  */ 
  16. - (void)xw_roundedCornerWithRadius:(CGFloat)radius cornerColor:(UIColor *)color corners:(UIRectCorner)corners; 
  17.  
  18. /** 
  19.  設置一個帶邊框的圓角 
  20.  
  21.  @param cornerRadii 圓角半徑cornerRadii 
  22.  @param color       圓角背景色 
  23.  @param corners     圓角位置 
  24.  @param borderColor 邊框顏色 
  25.  @param borderWidth 邊框線寬 
  26.  */ 
  27. - (void)xw_roundedCornerWithCornerRadii:(CGSize)cornerRadii cornerColor:(UIColor *)color corners:(UIRectCorner)corners borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth; 

下載下來這個分類直接拖入工程就可以使用了,調用很方便,不過使用的時候會發現,這三個API都需要傳一個參數 cornerColor (父視圖的背景色),所以也造成了這個功能的局限,即 如果該父視圖的顏色不是純色,此時該方式就不適用了,同樣 如果父視圖的顏色會變化,那實現起來的代碼也不那么優雅,如下圖,有點尷尬,這里引出了第二種方案。 

iOS和常見的離屏渲染Say Goodbye!
邊角顏色與背景色不符

 

2.通過修改layer.mask,首先通過貝塞爾曲線創建基于矢量的路徑,傳遞給CAShapeLayer進行渲染。路徑閉環,再把繪制出的Shape賦值給layer.mask,在Mask范圍之外的Layer將不被顯示從而達到圓角效果。代碼實現很簡單,如下: 

  1. UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(130, 330, 100, 100)]; 
  2.     [btn setBackgroundColor:[UIColor colorWithRed:(226.0 / 255.0) green:(113.0 / 255.0) blue:(19.0 / 255.0) alpha:1]]; 
  3.     [backgroundImageView addSubview:btn]; 
  4.     //繪制曲線路徑 
  5.     UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:btn.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:btn.bounds.size]; 
  6.     CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init]; 
  7.     //設置大小 
  8.     maskLayer.frame = btn.bounds; 
  9.     //設置圖形樣子 
  10.     maskLayer.path = maskPath.CGPath; 
  11.     btn.layer.mask = maskLayer;

效果圖: 

iOS和常見的離屏渲染Say Goodbye!
個人認為第二種方案更簡單而且功能擴展性更強些

 

設置陰影

常規做法: 

  1. //陰影的顏色 
  2. self.imageView.layer.shadowColor= [UIColorblackColor].CGColor; 
  3. //陰影的透明度 
  4. self.imageView.layer.shadowOpacity=0.8f; 
  5. //陰影的圓角 
  6. self.imageView.layer.shadowRadius=4; 
  7. //陰影偏移量 
  8. self.imageView.layer.shadowOffset=CGSizeMake(0,0);  

優化方案:

避免對shadowOffset直接修改,通過調用setShadowPath來提供一個CGPath給視圖的Layer,向Core Animation提供渲染的View的形狀Shape,就會減少離屏渲染計算 

  1. [self.imageView.layer setShadowPath:[[UIBezierPath  
  2.     bezierPathWithRect:myView.bounds] CGPath]]; 

補充:當使用陰影的視圖形狀發生變化時,即shadowPath并不會跟隨CALayer的bounds屬性進行變化,所以在layer的bounds產生變化以后需要手動更新shadowPath才能讓其適配新的bounds。

 

責任編輯:未麗燕 來源: 簡書
相關推薦

2010-04-26 13:55:32

Ubuntu通知區域

2013-12-24 14:54:07

微信騰訊智能電視

2015-03-24 10:51:46

Android鎖屏

2013-07-29 05:04:19

Cocos2dx橫屏豎

2009-08-11 14:31:10

云計算虛擬化

2017-07-25 09:55:10

iOS橫豎屏旋轉

2015-12-23 09:16:33

ios動畫渲染機制

2015-12-30 14:16:05

iOS動畫視圖渲染

2012-02-02 15:24:57

2011-07-28 14:45:03

iOS圖像顯示

2011-06-08 08:56:31

通知系統鎖屏功能Android

2019-03-21 14:18:38

iOS開發優化原因

2019-04-09 21:10:23

iOS加密框架

2018-07-19 11:49:54

搜狗

2013-08-21 11:15:54

iOS橫豎屏方案

2018-06-08 14:39:54

macOSiOSMac

2022-01-25 10:11:10

紅綠屏蘋果BUG

2013-07-29 04:24:40

iOS開發學習ViewControl

2019-01-08 05:57:09

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕日韩欧美一区二区三区 | 99福利视频 | 亚洲精品一区二区三区中文字幕 | 精品视频国产 | 国产精品亚洲综合 | 国产99久久精品一区二区永久免费 | 亚洲一区中文字幕 | 综合色播| 欧美在线色视频 | 国产中文| 国产精品入口久久 | 久久男人 | 色婷婷久久久亚洲一区二区三区 | 欧美精品一二三区 | 凹凸日日摸日日碰夜夜 | 亚洲一区| 丁香五月网久久综合 | 成人a在线 | 在线播放国产一区二区三区 | 久久久爽爽爽美女图片 | 欧美日韩中文在线观看 | 国产精品免费一区二区三区四区 | 久久国产精品视频观看 | 国产精品一区二区在线 | 五月婷婷色 | www.9191 | 国产精品永久免费 | 欧美精品乱码久久久久久按摩 | 中文字幕91av | 一区二区三区观看视频 | 欧美日韩毛片 | 欧美视频在线观看 | 九九热热九九 | 蜜臀91视频 | 日本精品久久久久久久 | 中文字幕亚洲一区 | 天天夜天天操 | 久草在线在线精品观看 | 久久久久久综合 | 久久精品国内 | 亚洲v日韩v综合v精品v |