iOS程序灵魂之性能优化.

作者: HelloYeah | 来源:发表于2016-03-07 15:08 被阅读574次

    导读

    一款手机应用 从开发过程中就要做好 性能优化,这样才能 让用户体验度 提升, 假如 我们打开一个应用 出现卡顿, 不流畅,则会很影响 用户对该应用的态度,产品狗 都很注意这些人机交互方面的 体验。性能是一款App的灵魂.

    开发人员在处理 性能问题时,需要做的第一件事情就是判断是否是应用自身引起的性能问题,然后再对症下药

    不过我得要提一下,“过早的优化是万恶之源”,在需求未定,性能问题不明显时,没必要尝试做优化,而要尽量正确的实现功能。做性能优化时,也最好是走修改代码 -> Profile -> 修改代码这样一个流程,优先解决最值得优化的地方。

    对于 CPU 的卡顿,它可以通过内置的 CADisplayLink 检测出来;对于 GPU 带来的卡顿,它用了一个 1x1 的 SKView 来进行监视。



    应用层的性能优化通常可以从以下几个方面考虑:

    1.了解编程语言的编译原理,使用高效编码方式从语法上提高程序性能;

    2.采用合理的数据结构和算法提高程序性能,这往往是决定程序性能的关键;

    3.重视界面布局优化;

    4.采用多线程、缓存数据、延迟加载、提前加载等手段,解决严重的性能瓶颈;

    5.合理配置虚拟机堆内存使用上限和使用率,减少垃圾回收频率;

    6.合理使用native代码;

    7.合理配置数据库缓存类型和优化SQL语句加快读取速度,使用事务加快写入速度;

    8.使用工具分析性能问题,找出性能瓶颈;

    9.iOS中性能优化集锦

    避免创建不必要的对象,合理的使用单例模式,

    创建太多的对象会造成性能低下,这谁都知道,可是为什么呢?首先分配内存本身需要时间,其次虚拟机运行时堆内存使用量是有上限的,当内存到达一定程度时会产生内存警告,系统会自动释放一些闲置的对象.可想而知,如果有对象频繁的创建和销毁,或者内存使用率很高,就会造成应用程序严重卡顿。

    单例模式,提供了对唯一实例的受控访问。由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

    离屏渲染问题:

    当一个视图中有大量圆角,应该考虑使用Core Graphics的技术进行绘制操作(即Quarz2D绘图)来实现圆角.替代cornerRadius,mask方案.深入一步优化的话,可以考虑异步绘制.在异步线程中绘制圆角.

    为了避免离屏渲染,你应当尽量避免使用 layer 的 border、corner、shadow、mask 等技术,而尽量在后台线程预先绘制好对应内容。

    视图宽高计算问题:

    Layout计算视图布局宽高 是一个相对耗时的操作,当一个界面有大量的需要计算宽高的视图时(如TabbleView),应将视图的宽高进行缓存处理.避免重复的计算.若要再进一步优化的话,可以将计算操作放入工作线程中.等计算完成后再回到主线程刷新UI.

    面试官喜欢问的关于SDWebImage的性能优化处理

    SDWebImage

    框架封装了很多网络异步下载图片的方法,性能也算很不错. 其实我们还可以做进一步优化,在显示简单的单张图片时,可以利用UIView.layer.contents 就足够了,没必要使用 UIImageView 带来额外的资源消耗,为此我们在 CALayer上添加了 setImageWithURL 等方法

    TabbleView列表中有多个视觉元素并不需要触摸事件,这些元素可以用图层合成技术预先绘制为一张图。 再进一步减少每个 Cell 内图层的数量,用 CALayer 替换掉 UIView。 当每个 Cell的类型都是相同的,但显示的内容却各部一样,比如有的 Cell 有图片,有的 Cell 里是卡片。把 Cell 按类型划分,进一步减少 Cell内不必要的视图对象和操作,应该能有一些效果。

    关于透明度对性能的影响

    只要一个视图的不透明度小于1,就会导致blending.blending在iOS的图形处理中,blending主要指的是混合像素颜色的计算。举个例子,我们把两个图层叠加在一起,如果第一个图层的有透明效果,则最终像素的颜色计算需要将第二个图层也考虑进来。这一过程即为Blending。

    为什么Blending会导致性能的损失?

    原因是很直观的,如果一个图层是不透明的,则系统直接显示该图层的颜色即可。而如果图层是透明的,则会引入更多的计算,因为需要把下面的图层也包括进来,进行混合后颜色的计算。

    视图的延迟加载

    如果界面中有一部分视图控件不需要立即显示,则我们可以将它设计成延迟加载模式,当真正要使用它的时候再进行创建.


    暂且就想到了这么多,剩下的以后再慢慢补上.大家如果有要我补充的可以在下面评论,我有空就补上.

    相关文章

      网友评论

      • 酱油葱:能针对每个点进行拓展讲解么?建议附上代码或实例。有些通过纯文字描述比较不好理解
        酱油葱::sweat:还想找你要文章的呢……
        链接不谢:https://medium.com/ios-os-x-development/perfect-smooth-scrolling-in-uitableviews-fd609d5275a5#.so9tpnlk1
        酱油葱:@HelloYeah 话是这么说,但是展开讲会丰富很多。例如国外作者出的博客针对TableView的优化,看完后能立刻用,实践中去形成经验总结,比直接提供经验总结好多了。这个看起来有点像编程规范😅
        HelloYeah: @be47022ef6ea 这些关于优化的在项目中都比较分散。一般当项目比较大的时候,才会考虑做性能优化。平时练习写的demo稍微注意点就可以。

      本文标题:iOS程序灵魂之性能优化.

      本文链接:https://www.haomeiwen.com/subject/odoakttx.html