manajay

Valar Morghulis Valar Dohaeris

静下心来,用心观察 处处都透着生活的美.


iOS离屏渲染

文章内容主要来自 seedante

1.什么是离屏渲染

obj 中国有一篇文章专门提到了离屏渲染的问题,文章中提到⎡直接将图层合成到当前显示屏幕的帧缓冲区中,比先在屏幕外面创建新的缓冲区,然后渲染到纹理中,最后将结果渲染到当前显示屏幕的帧缓冲区中,性能要好的多⎦

  • 主要原因是环境切换 * 转换环境到屏幕外缓冲区* 转换屏幕到帧缓冲区*
  • 触发屏幕渲染后 这种情况发生在 每一帧 ,界面如果在滚动过程中 有大量的离屏渲染发生会严重影响帧率

2. 影响离屏渲染的原因

  • GPU版本的离屏渲染 -> 更改 mask,shadow,Group opacity,edge antialiasing
  • CPU 版本的离屏渲染 -> 使用 Core Graphic 里面的绘制 API 也会触发离屏渲染 ,比如 drawRect:

  • 系统圆角的离屏渲染
view.layer.cornerRadius = aRadius;
view.layer.maskToBounds = true 

3. 圆角解决方案

  • 异步绘制圆角
  • 本地图片 让 UI 提供圆角图片
  • 使用遮罩 ,边缘让背景色 和 周边颜色 保持一致 ;中间为透明色

4. 本文中涉及的基础知识

4.1 UIView 与 CALayer 的关系

  • CALayer 负责显示内容 contents
  • UIView 负责为其提供内容,以及负责处理触摸事件,参与响应链
  • CALayers have their own background , border and contents
  • contents 必须为一个 CGImage 才能显示

4.2 UIImageView

  • UIImage 是对CGImage 的一个轻量的封装 (UIImage is a lightweight wrapper around CGImage )
  • CALayer also has CGImage as contents
  • CGImage backed by file or data,eventually by bitmap

4.3 RoundedCorner

  • cornerRadius 的英文说明
  • Setting the radius to a value greater than 0.0 causes the layer to begin drawing rounded corners on its background. By default,the corner radius does not apply to the image in the layer’s contents property ;it applies only to the background color and border of the layer . However, setting the masksToBounds property to YES causes the content to be clipped to the rounded corners.
  • 只对前景框和背景色起作用

4.4 重绘方案的优化

  • 将图像重新绘制为圆角图像相当于多了一份,要不要缓存?
  • A 第一次重绘后将这些圆角图像缓存在磁盘里,第二次加载直接使用缓存的圆角图像;
  • B 直接保存在内存里,在内存比较吃紧时显然不是个好选择
  • C 不缓存,和系统圆角一样,每次都重绘,浪费电量

4.5 文本视图类上实现圆角

  • UTextField 自带圆角效果
  • UILabel UITextView 首先保证contents 呈现透明的背景色 ,只需要设置 layer 的 backgroundColor ,再加上 cornerRadius 就 OK

  • 阴影设置 shadowPath ,默认为 nil
最近的文章

集成微信的第三方登录

微信SDK 的集成略微信开发者平台注册 注册应用名 应用的APPID APPKEY ,藏家圈项目中,创建了新的微信注册帐号,1.2.5版本的时候,在配置文件 和 代码的宏定义中 更换了相应的APPID ,否则之前的分享和登录功能都不能使用 回调了!微信SDK 的使用 如果项目中 使用 SVN 管理的话, 千万注意要 手动用命令行 将SDK 的.a静态库文件,添加到版本库中,否则 SVN 是默认 ignore 静态库的,编译会报各种找不到文件 API 的错误 做微信的登录功能 ,自定义...…

第三方 , 微信继续阅读
更早的文章

Jekyll<一>环境

IT人必须弄个自己的博客我选择的是基于Github上的github-pages 之Jekyll静态博客.gem 源被墙使用国外服务器 下载文件经常会遇到这种问题// 使用 gem sources 查看当前的源// 更换gem源gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/不要淘宝的源了 其他的 Homebrew-Ruby-翻墙可以去我的其他文章查看Gem依赖问题本人建立的博客使用的...…

ruby,Jekyll继续阅读