界面流畅度 大都跟list scrollView有紧密关联

流畅的视觉:就是如丝般顺滑

不流畅视觉:”卡顿”,”抖动”,”迟顿感”

以上两种状态的描述 都是基于主观感觉,对于开发者来说 确实应该有一个临界指标来参考,自己写的东西是否还有优化的空间呢.

Frames per Second(每秒帧数)   这个指标 可以通过Instruments 工具中的 Core Animation来观察.(xCode -> Tools -> Instrument)

帧数为 0 说明页面处于静止 只要页面一动起来,这个帧数就会有变化 然后再趋于静止.也就是说页面 滚动起来帧数是一个呈”非对称”抛物线的走势.

所以达到峰值的帧数 会呈现连续变化的一个状态 那么这个就是是它的流畅度 ,一般普通的一个list 滚动起来 流畅度 达到60左右 (亲测自己的app的一个普通页面),一个复杂页面53 - 60(亲测).网上有人这么说”45帧每秒,这个帧率已经让人感觉到不那么顺滑了,如果低于40帧每秒,普通用户就会察觉明显的不流畅了”.所以大家可以根据这些做参考,或者 是 测试自己的应用 比较几个普通页面 和一个复杂页面也可以有一个相对的参照.就可从理论上分析 是否这个相对比较复杂的页面是否值得优化呢.

可以优化的地方(就是平常拍脑门能想到的地方)

1.CPU:可以通过Instruments里面的工具检测cpu等 查出 到底是实现的哪个功能比较增加CPU的负担

2.如果是tableView. 组织数据很繁琐没有用model来映射? 是否cell重用? 绘制高度的方法是不是很冗长,不断的在重复计算? 需要刷新tableView 使用了不恰当地方式?

3.在滚动视图中 圆角的处理

一般情况下我们会这样做:

.layer.masksToBounds = YES;

.layer.cornerRadius = imageView.size.width * 0.5;

这个方法在滚动视图中会是特别影响性能

原因:

导致拖慢帧率的原因其实都是Off-Screen Rendering(离屏渲染).

离屏渲染:是指CPU在当前屏幕缓冲区以外再开辟一个新的缓冲区进行渲染操作.

离屏渲染是一个很好优化性能的方式,但是频繁发生离屏渲染(滚动屏幕 就会很频繁啊)是非常耗时的。如果是一个圆角几乎不会对帧率有太大影响,关键数量要是好多个.通过上面的定义可以看出”离屏渲染”关键不是渲染 而是 离屏.

离屏代价:主要是创建缓冲区和上下文切换的原因。创建新的缓冲区代价都不算大,付出最大代价的是上下文切换!!!!!(满纸荒唐言 一把辛酸泪  谁被坑过 谁知道)

关于上下文切换:

上下文切换在哪都是一个相当耗费时间的操作,不论是 CPU渲染或是进程切换.其过程:

(1)我们要保证当前屏幕渲染环境

(2)切换到一个新的绘制环境—>申请绘制资源—>初始化环境—>开始绘制—>绘制结束—>销毁绘制环境

(3)回到主屏幕呈现 或者 再开辟一个新的离屏渲染重复(2)

解决:

那么如何应对这个问题呢?不要在滚动视图使用cornerRadiu 可以使用下面的方法

(1)非要作死使用layer.ornerRadius,记得还要添加下面方法

.layer.shouldRasterize = YES;  //这样大部分情况下可以马上挽救你的帧数在55帧每秒以上。shouldRasterize = YES会使视图渲染内容被缓存起来,下次绘制的时候可以直接显示缓存,当然要在视图内容不改变的情况下。(具体解释  layer的头文件,进入查看这个属性的英文说明  不觉明厉)

.layer.rasterizationScale = [UIScreen mainScreen].scale;//需要适当设置"抗锯齿"  否则在retina的设备上这些视图会出现锯齿状。(具体了解参看 layer 属性)

(2)如果可以用切图遮罩代替的话 会效率很高

(3)预先缓存住 圆角的图片(预处理圆角图片在后台处理,处理完毕后缓存起来,再在主线程显示),来避免了离屏渲染

参考资源

http://www.zhihu.com/question/20382396  (知乎)

http://www.cnblogs.com/ioriwellings/p/5011993.html (更具体的解决方案)

iOS 优化界面流畅度的探讨的更多相关文章

  1. 如何让iOS 保持界面流畅?这些技巧你知道吗

    如何让iOS 保持界面流畅?这些技巧你知道吗   作者:ibireme这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如 ...

  2. 【转】iOS保持界面流畅的技巧

    原文链接:iOS保持界面流畅的技巧 这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如何构建流畅的交互. Index演示 ...

  3. fir.im Weekly - iOS 保持界面流畅的技巧

    生命不息,coding 不止.本期 fir.im Weekly 收集了微博上的热转资源,包含 Android.iOS 开发工具.源码分享,产品 UI 设计的好文章,还有一些程序员成长的 Tips,希望 ...

  4. iOS 保持界面流畅的技巧 (转载)

    这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如何构建流畅的交互. Index 演示项目 屏幕显示图像的原理 卡顿产生 ...

  5. [原] Android持续优化 - 提高流畅度

    一.形象的感官一下流畅度概念 1. 这是官方给出的概念:Android流畅运行,需要运行60帧/秒, 则需要每帧的处理时间不超过16ms. 2. 每秒帧数,实际上就是指动画或视频每秒放映的画面数.因此 ...

  6. iOS 保持界面流畅的技巧

    http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

  7. Android持续优化 - 提高流畅度

    http://www.cnblogs.com/purediy/archive/2013/12/26/3492865.html

  8. iOS---------查看界面的流畅度

    iOS查看屏幕帧数工具--YYFPSLabel iOS 保持界面流畅的技巧 iOS 优化界面流畅度的探讨 先研究一下     改天自己出一篇文章

  9. iOS如何提高页面流畅度

    A.提高CPU性能 对象创建1.尽量用轻量的对象代替重量的对象,比如CALayer 比 UIView 要轻量许多,如果不考虑交互事件的话,可以选择CALayer.2.Storyboard和xib加载对 ...

随机推荐

  1. Ubuntu安装Sun JDK

    Ubuntu 14.04 下安装 Sun JDK 1.8.0 1.下载JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk8- ...

  2. Android.mk解析

    https://developer.android.com/ndk/guides/android_mk.html#over LOCAL_STATIC_LIBRARIES PREBUILT_STATIC ...

  3. Spring MVC列表多选框

    以下示例显示如何在使用Spring Web MVC框架的表单中使用列表框(Listbox).首先使用Eclipse IDE来创建一个WEB工程,实现一个让用户可选择自己所善长的技术(多选)的功能.并按 ...

  4. Linux 常用文件管理命令

    Command Description cat filename 查看文件内容.举例:cat pushticketfast.sh   --最好用tail -n 500  cd dirname 改变所在 ...

  5. android EditText 限定中文个数与英文个数的解决方式

    EditText 限定中文8个英文16个的解决方法. 在EditText上控件提供的属性中有限定最大最小长度的方法. 可是,对于输入时,限定中文8个英文16个时,怎么办?相当于一个中文的长度是两个英文 ...

  6. OpenCV学习笔记:opencv_core模块

    一,简介: opencv最基础的库.包含exception,point,rect,size,slice,vector,matrix,image等数据结构,和相应的操作函数,以及一些基础算法. 二,分析 ...

  7. go反射----4构建

    声明:文章内容取自雨痕老师<Go语言学习笔记> 反射库提供了内置函数make和new的对应操作,其中最有意思的就是MakeFunc.可用它实现通用模板,适应不同数据类型. package ...

  8. 读取文件之<绝对路径>与<相对路径>

    前言:字符流.字节流读取文件,下面的代码是在网上找到的一个各种文件读取方式,还算比较详细,分享给大家. public class ReadFromFile { /** * 以字节为单位读取文件,常用于 ...

  9. spring无法启动常见原因及排查方法

    这里总结的问题,通常啥错误也不报,需要自个debug排查,当然每个人遇到的问题可能是不同的,这里仅仅是我个人帮同事解决问题后的一些总结,可能网上的小伙伴可能也遇到,姑且简单记录一下: 1. mybat ...

  10. python 线程(thread)

    #coding:utf-8#多线程#Python的标准库提供了两个模块:thread和threading,thread是低级模块,threading是高级模块,对thread进行了封装 #绝大数情况下 ...