浅谈iOS中的视图优化
引言:
让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为一个细心的开发者,我觉得很有必要来谈谈iOS中的视图优化。
本文从开发者最容易犯错的地方出发,结合例子,从以下几个角度阐述如何进行视图优化:
Color Blended Layers
Color Copied Images
Color Misaligned Images
Color Offscreen-Rendered
这个4个选项,可以从模拟器的Debug选项中看到
模拟器选项
别急,我们一个个来看,首先是Color Blended Layers。
Color Blended Layers
官方是这么描述它的:
Shows blended view layers. Multiple view layers that are drawn on top of each other with blending enabled are highlighted in red. Reducing the amount of red in your app when this option is selected can dramatically improve your app’s performance. Blended view layers often cause slow table scrolling.
简单来说,屏幕上的每个像素点的颜色是由当前像素点上的多层layer(如果存在)共同决定的,GPU会进行计算出混合颜色的RGB值,最终显示在屏幕上。而这需要让GPU计算,所以我们要尽量避免设置alpha,这样GPU会忽略下面所有的layer,节约计算量。
下面让我们来看一下设置alpha的效果,上面的灰色小块是透明的。
demo
检测后
效果很明显,设置了透明的view会让GPU计算图层混合后的最终结果。
我想再提一下opaque这个属性,网上普遍认为view.opaque = YES,GPU就不会进行图层混合计算了。而这个结论是错误的,其实view.opaque事实上并没什么卵用。
如果你真的想达到这个效果,可以用layer.opaque,这个才是正确的做法。
Color Copied Images
“If an image is in a color format that the GPU can not directly work with, it will be converted in the CPU.”
Session 419 WWDC 2014中详细介绍了这货,其实这个东西跟开发者并没什么关系,遇到这种情况,我们大可以摔锅给设计(当然你乱做优化导致图片颜色格式改变,那就没办法了)。
简而言之,苹果的GPU只解析32bit的颜色格式,记住是32bit。
如果你放一张图片,而它的颜色格式却不是32bit,CPU会先进行颜色格式转换,再让GPU渲染。乖乖的CPU就默默做了这个多余的工作。
所以给你两个选择:
让设计湿都给你切32bit的图
自己去跑个异步线程来转换颜色去吧,不要去堵塞本来就压力很大的主线程!
你选哪个?当然是让设计湿切图啦,我才不愿意多写代码。
而且于情于理,就算异步转换颜色,也会导致性能损耗,比如电量增多,发热强变大等等等等。
上demo:
demo
检测后
两个一样的图,仅仅是采用了不同颜色格式,上面是32bit,下面是8bit,于是乎,8bit的会导致Color Copied Images8,让CPU多运算了。
Color Misaligned Images
Misaligned Image表示要绘制的点无法直接映射到频幕上的像素点,此时系统需要对相邻的像素点做anti-aliasing反锯齿计算,增加了图形负担,通常这种问题出在对某些View的Frame重新计算和设置时产生的。
很简单,不要出现image size与imageView size不同的情况,这样会触发反锯齿计算,增加性能损耗。
上demo:
demo
一下就好看出来,下面的图片尺寸不合适。
所以,实际开发中,本地的图片比较好把控,只需要写好对应的尺寸就好了,但是对于download下来的图片,可以在加载完后进行size处理,以满足imageView frame。特别是对于很多app,有大量的tableview,如果进行处理,则会大幅度提高流畅度。
Color Offscreen-Rendered
最后就是Offscreen-Rendered(离屏渲染)了。
这个东西讲起来感觉非常复杂,我觉得只需要知道,离屏渲染会导致CPU在后台保存一份bitmap,所以会导致CPU多余运算。
而避免的方式则是避免去做触发的动作:
重写drawRect方法
masksToBounds
其他一些手动触发离屏渲染的动作
最后看个demo:
万恶的圆角
发现罪恶
如图所示,触发了离屏渲染。
总结:
如果开发阶段都注意到这些细节,那么我觉得性能将不会是很大的问题了。
浅谈iOS中的视图优化的更多相关文章
- 浅谈iOS中的userAgent
浅谈iOS中的userAgent User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...
- 浅谈iOS中MVVM的架构设计与团队协作
说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...
- IOS中 浅谈iOS中MVVM的架构设计与团队协作
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈iOS中MVVM的架构设计与团队协作【转载】
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈iOS中的单例模式
iOS中的单例模式 就我本身理解而言,我认为的单例:单例在整个工程中,就相当于一个全局变量,就是不论在哪里需要用到这个类的实例变量,都可以通过单例方法来取得,而且一旦你创建了一个单例类,不论你 ...
- 浅谈 iOS 中的 Activity Indicator
Activity Indicator 是iOS开发中必不可少的一个视图.本文就简单地总结一下这个Activity Indicator 的使用方法. 默认 Activity Indicator 以下的函 ...
- iOS——浅谈iOS中三种生成随机数方法
ios 有如下三种随机数方法:
- 浅谈iOS中MVVM的架构设计
MVVM就是在MVC的基础上分离出业务处理的逻辑到viewModel层. M: Model层是API请求的原始数据,充当DTO(数据传输对象),当然,用字典也是可以的,编程么,要灵活一些.Model ...
- 浅谈OI中的底层优化!
众所周知,OI中其实就是算法竞赛,所以时间复杂度非常重要,一个是否优秀的算法或许就决定了人生,而在大多数情况下,我们想出的算法或许并不那么尽如人意,所以这时候就需要一中神奇的的东西,就是底层优化: 其 ...
随机推荐
- HDU 3586-Information Disturbing(树形dp)
题意: n个节点的通信连接树,切断每个边有一定的花费,要你切断边,在总花费不超过m的前提,使所有的其他节点都不能和节点1(根)连通,切边时有花费上限,让你最小化这个上限. 分析:最小化最大值,想到二分 ...
- Jmeter性能测试之如何写Java请求测试用例类
一. 引言: 最近工作中的一个项目要求做性能测试,该项目由提供服务的几个应用组成,选用的框架是阿里巴巴公司开源的服务框架Dubbo.关于Dubbo的介绍,网上也有很多资料,本人只是做了粗略的了解,没有 ...
- 设计模式_Bridge
形象的例子: —早上碰到MM,要说早上好,晚上碰到MM,要说晚上好:碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦.不要问我“早上碰到MM新做了个发型怎么说”这种 ...
- thinking in java Generics Latent typing
The beginning of this chapter introduced the idea of writing code that can be applied as generally a ...
- stm32 CAN引脚-笔记
默认: CANRX – > PA11 CANTX - >PA12 映射1: CANRX – > PB8 CANTX - >PB9 映射2: CANRX – > ...
- D3D游戏编程系列(六):自己动手编写第一人称射击游戏之第一人称视角的构建
说起第一人称射击游戏,不得不提第一人称视角啊,没有这个,那么这个第一就无从谈起啊,我作为一个观察者究竟如何在这个地图上顺利的移动和观察呢,那么,我们一起来研究下. 我们首先来看下CDXCamera类: ...
- PING命令入门详解(转载)
本文转自http://www.linkwan.com/gb/tech/htm/928.htm 1.Ping的基础知识 ping命令相信大家已经再熟悉不过了,但是能把ping的功能发挥到最大的人却并不是 ...
- hibernate学习五(关系映射多对一与一对多)
一.多对一 多对一(或者一对多):在学生与老师的情况下,一个老师可以教多个学生,但一个学生只能被教一个老师教: 对于类:在多的那方拥有一的那方的一个实体 二.修改student.java和teache ...
- 学习和理解C#的委托
去年自学C#用的教程是入门级的<学通C#的24堂课>,教材里面也没有提到委托和事件,工作中也没怎么用到.后来一次在网上看了一些大牛的博客,读完之后感觉懵懵懂懂,似懂非懂,过了两三天之后,却 ...
- JavaScript要点 (一) 变量-作用域
JavaScript 作用域 作用域—可访问变量的集合. 全局变量或者函数可以覆盖window对象的变量或者函数: 局部变量和window对象可以覆盖全局变量和函数. JavaScript 作用域 在 ...