iOS解决滑动面卡顿的基本技巧.doc

上传人:scccc 文档编号:12013746 上传时间:2021-12-01 格式:DOC 页数:7 大小:20KB
返回 下载 相关 举报
iOS解决滑动面卡顿的基本技巧.doc_第1页
第1页 / 共7页
iOS解决滑动面卡顿的基本技巧.doc_第2页
第2页 / 共7页
iOS解决滑动面卡顿的基本技巧.doc_第3页
第3页 / 共7页
iOS解决滑动面卡顿的基本技巧.doc_第4页
第4页 / 共7页
iOS解决滑动面卡顿的基本技巧.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《iOS解决滑动面卡顿的基本技巧.doc》由会员分享,可在线阅读,更多相关《iOS解决滑动面卡顿的基本技巧.doc(7页珍藏版)》请在三一文库上搜索。

1、iOS 解决滑动页面卡顿的基本技巧iOS 解决滑动页面卡顿的基本技巧引言在开发中我们常常会遇到布局比较复杂的 cell, 在滑动的时候 会导致界面不流畅, 出现卡顿的现象, 这是由于 CPU 计算和 GPU 渲染,之间未及时交换数据丢失帧导致的结果。 imageView 尽量设置为不透明opque 尽量设置为 YES当 imageView 的 opque 设置为 YES 的时候其 alpha 的属性就 会无效, imageView 的半透明取决于其图片半透明或者 imageView 本身的背景色合成的图层 view 是半透明的。 如果图片全部不是半透明就不会触发图层的 blend 操作,整 个

2、图层就会不透明。如果叠加的图片有出现半透明的, 就会立马触发图层的 blend 操作,整个图层不透明。opque 设为 NO 当 opque 为 NO 的时候,图层的半透明取决于图片和其本身 合成的图层为结果。背景色尽可能设为 alpha 值为 1当某一块图层的 alpha 和其 superView 的背景色 alpha 不一样 的时候会触发 alpha 合成操作,这是一项看似很简单但却是 非常消耗 CPU 性能的操作。 至于 alpha 叠加的概念如果有问 题可以查看官方说法。UIView 的背景色设置UIView 的背景色尽量不要设置为 clearColor ,这样也会触发 alpha 叠

3、加,在 tableView 滑动的时候是非常消耗性能的。子 视图的背景色尽可能设置成其 superView 的背景色,这样图 层合成的时候不会触发 blend 操作。最好不使用带alpha通道的图片,如果有alpha尽量让美工取消 alpha 通道。alpha通道的概念特地请教了下公司UI MM,是透明的意思cell 上 layer 尽量避免使用圆角在工作中关于滑动界面我们会时常遇到 cell 行设置头像为圆 角等需求, 这时候我们尽量避免使用 layder.cornerRadius ,因 为这会触发离屏渲染。离屏渲染很耗时间。离屏渲染:是 GPU 渲染区的一个渲染缓冲区,我们所用的 所有显示

4、屏的图形图像都是通过 GPU 进行渲染,然后显示 在屏幕上。 GPU 负责渲染会把渲染的图形放到缓冲区然后 CPU 就会发一个垂直信号显示到屏幕。如果要使用圆角,我们可以设置为 layer.shouldRasterize =YES,其实这个设置是触发光栅化,可以大大提高渲染的性 能。我的理解光栅化就是类似于 cell 的重用机制。 光栅化:把第一次渲染好的图层放到缓冲区,那么下次不需 要再离屏渲染直接就可以从缓冲区拿去使用。优化图片的加载方式我们都知道图片的加载方式有两种形式:1、 UIImage *headerImage = UIImage imageNamed:"haodf.pn

5、g" ;2、 UIImage * headerImage = UIImage imageWithContentOfFile:"haodf.png" 我们讲讲两种加载图片方式的区别:第一种:当我们经常需要这张图片并且仅仅是小图的时候, 我们可以使用此种方式加载图片。这种方式是把图片缓存在图片缓存区,当我们使用的时候会 通过图片的名字也就是通过 key 的方式去查找图片在缓存区 的内存地址。当我们使用很多图片的时候系统就会开辟很多内存来存储图片,所以qq、微信我们很多时候都会去清除缓存操作。第二种:当我们使用工程里面的一张大图并且使用次数很少甚至为 1 次的时候,我们

6、优先会采用这种方式加载图片,这 种方式当使用完图片的时候会立即丢弃释放资源,所以对性 能不会带来负担。尽量延迟图片的加载当我们在滑动页面的时候尤其对于那种布局特别复杂的cell ,滑动的时候不要加载图片, 当滑动挺值得时候再进行图 片的加载。我们都知道不管是 UITableView 还是 ScrollView 在滚动的时 候需要显示东西都是通过 runLoop 去拿。当滚动的时候 runLoop 会处于 NSRunLoopTrackingMode 的模 式,我们可以通过一个主线程队列 dispatch_after 或者 selfPerformSelector 设置 runLoop 的模式为 N

7、SDefaultRunLoopMode 模式,就可以做到停止滚动再加载 图片。注:其实严格意义上 selfPerformSelector 的事件就是在主线 程队列中等待。优先加载理念 一直很好奇墨迹天气这款 app 基本都是很炫的图片,是如何 做到滑动时候不卡顿的呢,在 cocoachina 上有幸认识了一位 墨迹天气的大牛,说是采用优先加载的理念,既先展示一部 分,当滑动的时候再加载下面的一部分这样就保持流畅。至于具体没透露最重要的一点就是避免阻塞主线程让图片的绘制、图片的下载、对象的创建、文本的渲染等这 些耗时的操作尽可能采用子线程异步的方式去处理,对于 layer 及 UI 的操作不得不

8、在主线程里面,只能想办法优化, 所以此处给大家推荐 Facebook 的得力之作 ASDK ,有兴趣的 可以好好研究下,现在好多公司都进行采用。争议最多的 xib 、storyBoard 、纯代码的问题苹果推出 storyboard 确实为开发者节省了大量的时间,提高 了开发效率,但是对于那种复杂的滑动界面,利用 storyboard 是非常消耗资源的,不信 的可以试试用性能工具 timeProfie 看看 cpu 所占的性能百分 比,其 CPU 的资源远远大于纯代码布局, 我看了一个国外的 网站介绍,这两种方式初始化对象分配内存的先后方式完全 不一样,至于具体细节有兴趣的可以找相关资料研究。当然对于那种重用性不强固定不怎么变化的界面还是很喜 欢 storyboard ,一蹴而就,节省成本。备注以上都是在项目中遇到这些现象的思考和想法,如果有不对 的地方,请加以纠正,谢谢!author: lije

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1