iOS开发--面试题:性能优化(后续)

302 阅读5分钟

面试题目录:

iOS--面试题:多线程
iOS--面试题:多线程(2)
iOS--面试题:多线程(结尾篇)

查看上文

六、如何高性能的画一个圆角?

视图和圆角的大小对帧率并没有什么卵影响,数量才是伤害的核心输出

首先上面的方式是不可取的,会触发离屏渲染。

• 如果能够只用 cornerRadius 解决问题,就不用优化。

• 如果必须设置 masksToBounds,可以参考圆角视图的数量,如果数量较少(一页只有几个)也可以考虑不用优化。

• UIImageView 的圆角通过直接截取图片实现,其它视图的圆角可以通过 Core Graphics 画出圆角矩形实现。

七、如何提升 tableview****的流畅度?

本质上是降低 CPU、GPU 的工作,从这两个大的方面去提升性能。

• CPU:对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制

• GPU:纹理的渲染卡顿优化在 CPU层面

• 尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用 CALayer 取代 UIView

• 不要频繁地调用 UIView 的相关属性,比如 frame、bounds、transform 等属性,尽量减少不必要的修改

• 尽量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性

• Autolayout 会比直接设置 frame 消耗更多的 CPU 资源

• 图片的 size 最好刚好跟 UIImageView 的 size 保持一致

• 控制一下线程的最大并发数量

• 尽量把耗时的操作放到子线程

• 文本处理(尺寸计算、绘制)

• 图片处理(解码、绘制) 卡顿优化在 GPU层面

• 尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示

• GPU 能处理的最大纹理尺寸是 4096x4096,一旦超过这个尺寸,就会占用 CPU 资源进行处理,所以纹理尽量不要超过这个尺寸

• 尽量减少视图数量和层次

• 减少透明的视图(alpha<1),不透明的就设置 opaque 为 YES

• 尽量避免出现

离屏渲染

1.预排版,提前计算

在接收到服务端返回的数据后,尽量将 CoreText 排版的结果、单个控件的高度、cell 整体的高度提前计算好,将其存储在模型的属性中。需要使用时,直接从模型中往外取,避免了计算的过程。

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的点击加入群聊iOS交流群:642 363 427,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

尽量少用 UILabel,可以使用 CALayer 。避免使用 AutoLayout 的自动布局技术,采取纯代码的方式

2.预渲染,提前绘制

例如圆形的图标可以提前在,在接收到网络返回数据时,在后台线程进行处理,直接存储在模型数据里, 回到主线程后直接调用就可以了

避免使用 CALayer 的 Border、corner、shadow、mask 等技术,这些都会触发离屏渲染。
3.异步绘制

全局并发线程

高效的图片异步加载

八、如何优化 APP****的电量?

程序的耗电主要在以下四个方面:

• CPU 处理

• 定位

• 网络

• 图像

优化的途径主要体现在以下几个方面:

• 尽可能降低 CPU、GPU 的功耗。

• 尽量少用 定时器。

• 优化 I/O 操作。

• 不要频繁写入小数据,而是积攒到一定数量再写入

• 读写大量的数据可以使用 Dispatch_io ,GCD 内部已经做了优化。

• 数据量比较大时,建议使用数据库

• 网络方面的优化

• 减少压缩网络数据 (XML-> JSON-> ProtoBuf),如果可能建议使用 ProtoBuf。

• 如果请求的返回数据相同,可以使用 NSCache 进行缓存

• 使用断点续传,避免因网络失败后要重新下载。

• 网络不可用的时候,不尝试进行网络请求

• 长时间的网络请求,要提供可以取消的操作

• 采取批量传输。下载视频流的时候,尽量一大块一大块的进行下载,广告可以一次下载多个

• 定位层面的优化

• 如果只是需要快速确定用户位置,最好用 CLLocationManager 的 requestLocation 方法。定位完成后,会自动让定位硬件断电

• 如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务

• 尽量降低定位精度,比如尽量不要使用精度最高的 kCLLocationAccuracyBest

• 需要后台定位时,尽量设置 pausesLocationUpdatesAutomatically 为 YES,如果用户不太可能移动的时候系统会自动暂停位置更新

• 尽 量 不 要 使 用 startMonitoringSignificantLocationChanges , 优 先 考 虑

startMonitoringForRegion:

• 硬件检测优化

• 用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件

九、如何有效降低 APP****包的大小?

降低包大小需要从两方面着手可执行文件

• 编译器优化

• Strip Linked Product、Make Strings Read-Only、Symbols Hidden by Default 设置为 YES

• 去掉异常支持,Enable C++ Exceptions、Enable Objective-C Exceptions 设置为 NO, Other C Flags

添加 -fno-exceptions

• 利用 AppCode 检测未使用的代码:菜单栏 -> Code-> Inspect Code

• 编写 LLVM 插件检测出重复代码、未被调用的代码资源

资源包括 图片、音频、视频 等

• 优化的方式可以对资源进行无损的压缩

• 去除没有用到的资源

十、什么是****离屏渲染?什么情况下会触发?该如何应对?

离屏渲染就是在当前屏幕缓冲区以外,新开辟一个缓冲区进行操作。离屏渲染出发的场景有以下:

• 圆角 (maskToBounds 并用才会触发)

• 图层蒙版

• 阴影

• 光栅化

为什么要避免离屏渲染?

CPU GPU 在绘制渲染视图时做了大量的工作。离屏渲染发生在 GPU 层面上,会创建新的渲染缓冲区,会触发 OpenGL 的多通道渲染管线,图形上下文的切换会造成额外的开销,增加 GPU 工作量。如果 CPU GPU 累计耗时 16.67 毫秒还没有完成,就会造成卡顿掉帧。

圆角属性、蒙层遮罩 都会触发离屏渲染。指定了以上属性,标记了它在新的图形上下文中,在未愈合之前, 不可以用于显示的时候就出发了离屏渲染。

• 在 OpenGL 中,GPU 有 2 种渲染方式

• On-Screen Rendering:当前屏幕渲染,在当前用于显示的屏幕缓冲区进行渲染操作

• Off-Screen Rendering:离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作

• 离屏渲染消耗性能的原因

• 需要创建新的缓冲区

• 离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏

(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕

• 哪些操作会触发离屏渲染?

• 光栅化,layer.shouldRasterize= YES

• 遮罩,layer.mask

• 圆角,同时设置 layer.masksToBounds= YES、layer.cornerRadius 大于 0

• 考虑通过 CoreGraphics 绘制裁剪圆角,或者叫美工提供圆角图片

• 阴影,layer.shadowXXX,如果设置了 layer.shadowPath 就不会产生离屏渲染
出自:

点击此处:文件获取

推荐 :

原文地址:www.jianshu.com/p/3eb437ea3…