iOS中解决页面卡顿小技巧(很常用)

1.为什么出现页面卡顿?

在开发中我们常常会遇到布局比较复杂的cell,在滑动的时候会导致界面不流畅,出现卡顿的现象,这是由于CPU计算和GPU渲染,之间未及时交换数据丢失帧导致的结果。

2.常见解决办法

1).UIImageView尽量设置为不透明

  • opque尽量设置为YES

当UIImageView的opque设置为YES的时候其alpha的属性就会无效,UIImageView的半透明取决于其图片半透明或者UIImageView本身的背景色合成的图层view是半透明的。

如果图片全部不是半透明就不会触发图层的blend操作,整个图层就会不透明。

如果叠加的图片有出现半透明的,就会立马触发图层的blend操作,整个图层不透明。

  • 背景色尽可能设为alpha值为1

当某一块图层的alpha和其superView的背景色alpha不一样的时候会触发alpha合成操作,这是一项看似很简单但却是非常消耗CPU性能的操作。

2).UIView的背景色设置

  • UIView的背景色尽量不要设置为clearColor,这样也会触发alpha叠加,在UITableView滑动的时候是非常消耗性能的。子视图的背景色尽可能设置成其superView的背景色,这样图层合成的时候不会触发blend操作。
  • 最好不使用带alpha通道的图片,如果有alpha尽量让UI设计人员取消alpha通道。

3).cell上layer尽量避免使用圆角

  • 在工作中关于滑动界面我们会时常遇到cell行设置头像为圆角等需求,这时候我们尽量避免使用layder.cornerRadius,因为这会触发离屏渲染。离屏渲染很耗时间。

    离屏渲染:是GPU渲染区的一个渲染缓冲区,我们所用的所有显示屏的图形图像都是通过GPU进行渲染,然后显示在屏幕上。GPU负责渲染会把渲染的图形放到缓冲区然后CPU就会发一个垂直信号显示到屏幕。

  • 如果要使用圆角,我们可以设置为layer.shouldRasterize = YES,其实这个设置是触发光栅化,可以大大提高渲染的性能。我的理解光栅化就是类似于cell的重用机制。

    光栅化:把第一次渲染好的图层放到缓冲区,那么下次不需要再离屏渲染直接就可以从缓冲区拿去使用。

4).优化图片的加载方式

图片的加载方式有两种形式:

UIImageView *image = [UIImageView imageView:@"1.png"];

UIImageView *image = [UIImageView imageWithContentOfFile:@"1.png"];

两种加载图片方式的区别:

  • 第一种:当我们经常需要这张图片并且仅仅是小图的时候,我们可以使用此种方式加载图片。

    这种方式是把图片缓存在图片缓存区,当我们使用的时候会通过图片的名字也就是通过key的方式去查找图片在缓存区的内存地址。

    当我们使用很多图片的时候系统就会开辟很多内存来存储图片,所以qq、微信我们很多时候都会去清除缓存操作。

  • 第二种:当我们使用工程里面的一张大图并且使用次数很少甚至为1次的时候,我们优先会采用这种方式加载图片,这种方式当使用完图片的时候会立即丢弃释放资源,所以对性能不会带来负担。

5).尽量延迟图片的加载

  • 当我们在滑动页面的时候尤其对于那种布局特别复杂的cell,滑动的时候不要加载图片,当滑动停止得时候再进行图片的加载。

    我们都知道不管是UITableView还是UIScrollView在滚动的时候需要显示东西都是通过runLoop去拿。

    当滚动的时候runLoop会处于NSRunLoopTrackingMode的模式,我们可以通过一个主线程队列dispatch_after或者selfPerformSelector设置runLoop的模式为NSDefaultRunLoopMode模式,就可以做到停止滚动再加载图片。

    注:其实严格意义上selfPerformSelector的事件就是在主线程队列中等待。

  • 优先加载理念

    采用优先加载的理念,既先展示一部分,当滑动的时候再加载下面的一部分这样就保持流畅。

6).避免阻塞主线程

  • 让图片的绘制、图片的下载、对象的创建、文本的渲染等这些耗时的操作尽可能采用子线程异步的方式去处理,对于layer及UI的操作不得不在主线程里面,只能想办法优化。

7).xib、storyBoard、纯代码的问题

  • 苹果推出storyboard确实为开发者节省了大量的时间,提高了开发效率,但是对于那种

    复杂的滑动界面,利用storyboard是非常消耗资源的,不信的可以试试用性能工具timeProfie看看CPU所占的性能百分比,其CPU的资源远远大于纯代码布局。

时间: 2024-10-06 20:49:16

iOS中解决页面卡顿小技巧(很常用)的相关文章

一些JavaScript中的DOM的优化小技巧

在进行DOM优化时需要关注的问题有:修改DOM的时候,会引起页面的重排,重绘.因为JS是单线程执行的,那么在重排重绘的过程中可能会阻塞用户的操作.为了更好的用户体验,必须要严格控制这些操作. 一.对象集合 NodeList 当我们调用:getElementsByTagName,getElementsByName,getElementsByClassName的时候,返回的结果是一个NodeList,这个NodeList是实时的.如果你修改对应的html,那么NodeList中也会得到修改. 而且,

Effective前端6:避免页面卡顿

.aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } .crayon-line span::after { content: " " } p { font-size: 15px; text-indent: 2em } #colorbox.crayon-colorbox,#cboxOverlay.crayon-colorbox,.crayon-colorbox #cboxWr

iOS:性能之卡顿检测

项目地址:https://github.com/tunsuy/iOSMonitorLag 该项目主要是针对ios项目的卡顿监控的探索,结合ios的运行机制和业界的实践,将其应用于公司项目中进行试运行,查看相关效果 二. 方案一 基于RunLoop 1. 背景 因为UIKit本身的特性,需要将所有的UI操作都放在主线程执行,所以也造成不少程序员都习惯将一些线程安全性不确定的逻辑,以及其它线程结束后的汇总工作等等放到了主线,所以主线程中包含的这些大量计算.IO.绘制都有可能造成卡顿. 在Xcode中

记录一个关于 Document.on绑定事件后,导致页面卡顿的情况

假设当前页面的js文件中有如下函数: function A(){ function B(); } function B(){ $(document).on("click","#元素id",function(){ dosomething……; }); } 函数A是一个按钮上绑定的onclick函数处理: 那么每次点击按钮触发A函数之后,都会导致B函数的执行,进而 $("#元素id") 这个元素就会绑定一次点击事件. 如果多次触发A函数之后,导致 $

关于移动端开发时iOS上滑屏卡顿的问题,以及电话类数字的样式失控问题

写在前面的话: tips:写移动的时候,那些头部需要固定显示在显示屏顶部的,通常在PC端我会用fixed来写.但是,在移动端,这并不是一个好方法,因为弹出输入小键盘的时候,会造成fixed 的元素偏移掉,在这里有两种方法可以解决: 1.建议移动端布局采用以下方式(见正文),如果有错误的地方,还请指正~ 2.另外还看到一篇文章提到这个问题,作者让固定的头部仍然采用fixed, 然后内容区也用了fixed,内容区的fixed元素这样写:{position:fixed;top:80px;bottom:

关于Java中Eclipse运行卡顿、未响应,Cpu100%的快速处理办法

1.与近几日我以及我的同事们遇到一件非常奇怪的问题,我们目前在实现一个小程序,但是不知为何,Eclipse突然变得很卡,以为是小问题最后闹到重启都没解决,于是 我开始查找造成这个现象的原因,发现这个程序如果不能很巧妙的避开计算次数非常多的情况,将会造成机器卡顿.下面我来说一下解决方式. 2.打开任务管理器,Ctrl+Alt+Delete, 点击"进程"栏,顺着往下面找 Java.exe 看下后面占用的cpu是不是50左右,如果是那就是我所说的问题了,如果没有那请另寻办法. 3.找到之后

iOS开发之软键盘使用小技巧

在iOS开发过程中,有时候需要弹出软键盘进行输入,有时候又需要在某些情况下隐藏软键盘,以提高用户体验.今天有几个关于软键盘的小技巧和大家分享. (1)只弹出数字键盘 有某些需求中,要求用户只能在Text Field中只能输入数字,这需要怎么做呢?可以写一个正则表达式用于判断用户输入:或者进行字符匹配等等.但是这都要写代码.程序员都是爱偷懒的.在iOS中可以通过简单设置,使弹出为数字键盘,这样用户输入就只能为数字了. 选中某个Text Field.选择右侧的Show the Attributes

分享页面级SEO小技巧三点

今天分享三个页面级SEO的小技巧,页面加载速度.网站结构什么的讲出来可能比较抽象,无法直接拿去实践,就不说了,我们讲一点可以立即拿去用的东西,不过,具体操作起来就要靠个人了. 1.增加页面内容,调整关键词密度 最好将关键词布局到页面重要位置,通常所说的F型布局即可,一般未经过专业优化的网站这样做过以后排名会有一个小幅度的提升. 至于原理,搜索引擎的工作主要有四大部分组成:抓取.索引.排序.展现.发外链需要等搜索引擎抓取.过滤.计算,周期长.见效慢,通常要达到质和量的积累才能有良好的效果;内链的建

iOS中崩溃调试的使用和技巧总结 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博 在iOS开发调试过程中以及上线之后.程序经常会出现崩溃的问题.简单的崩溃还好说,复杂的崩溃就须要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比較常见的. 如今网上有非常多关于解析崩溃信息的博客.可是大多质量參差不齐,或者有些细节没有注意到.今天写一篇博客总结一下我对崩溃调试的使用和技巧,假设有哪些错误或遗漏.还请指点.谢谢. 获取崩溃信息 在iOS中获取崩溃信息的方式有非常多,比較常见的