1:对象创建

对象创建会分配内存,调整属性,甚至还有读取文件等操作,比较消耗CPU资源。尽量用轻量的对象代替重量的对象,可以对性能有所优化。比如CALayer比UIView要轻量许多,那么不需要响应触摸事件的控件,用CALayer显示会更加合适,如果对象不涉及UI操作,则尽量放到后台线程区创建,可惜的是包含有CALayer的控件都只能在主线程创建和操作。在性能敏感的界面,Storyboard并不是一个好的技术选择。

尽量推迟对象创建的时间,并把对象的创建分散到多个任务中去。如果对象可以复用。并且复用的代价比释放创建新对象要小,那么这类对象应当尽量放到一个缓存池里复用。

  1. 对象调整:

对象的调整也经常是消耗CPU资源的地方,这里特别说一下CALayer,它内部并没有属性,当调用属性方法时,它内部是通过运行resolveInstanceMethod为对象临时添加一个方法,并把对应属性值保存到内部的一个Dictionary里,同时还会通知delegate,创建动画等等,非常消耗资源。UIView的关于显示相关的属性比如frame,bounds,transform等实际上都是CALayer属性映射来的,所以对UIView的这些属性进行调整时,消耗的资源要远大于一般的属性,应该尽量减少不必要属性的修改。

3:对象销毁:

对象的销毁虽然消耗资源不多,但累积起来不容忽视。通常当容器类持有大量对象时,其销毁时的资源消耗就非常明显。同样的,如果对象可以放到后台线程去释放,那就拖到后台线程。

4:布局计算:

视图布局的计算是APP中最为常见的消耗CPU资源的地方,最好能在后台线程提前计算好视图布局,并且对视图布局进行缓存。

不论通过何种技术对视图进行布局,其最终都会落到对UIView.frame/bounds/center等属性的调整上,对这些属性的调整非常耗资源,在需要时一次性调整好对应属性,而不要多次,频繁的计算和调整这些属性。

5:AutoLayout:

是苹果本身提倡的技术,在大部分情况下能很好的提升开发效率,但是AutoLayout对于复杂视图来说常常会产生严重的性能问题,随着视图数量的增长,AutoLayout带来的CPU消耗会呈指数级上升,如果你不想手动调整frame等属性,你可以用一些工具方法代替,或者使用ComponentKit,AsyncDisplayKit等框架。

6:文本计算:如果一个界面中包含大量文本,文本的宽高计算会占用很大一部分资源,并且不可避免,如果对文本的显示没有特殊要求,可以参考UILabel内部的实现方法,用[NSAttributedString boundingRectWithSize:options:context]来计算文本宽高。用-[NSAttributedString drawWithRect:options:context]来绘制文本。尽管这两个方法性能不错,但仍需要放到后台线程进行以避免阻塞主线程。

如果你用CoreText绘制文本,那么就可以先生成CoreText排版对象,然后自己计算

7:文本渲染:

屏幕上能看到的所有文本内容控件,包括UIWebView,在底层都是通过CoreText排版,绘制为Bitmap显示的。常见的文本控件UILabel,UITextView等,其排版和绘制都是在主线程进行的,当显示大量文本时,CPU的压力会非常大,对此解决方案只有一个,那就是自定义文本控件,用TextKit或最底层的CoreText对文本异步绘制,CoreText对象创建好后,能直接获取文本的宽高信息,避免了多次计算,CoreText对象占用内存较少,可以缓存下来以备稍后多次渲染。

8:图片的解码:

当你用UIImage或CGImageSource的那几个方法创建图片时,图片数据不会立即解码。图片设置到UIImageView或者CALayer.contents中去,并且CALayer被提交到GPU前,CGImage中的数据才会得到解码。这一步是发生在主线程,并且不可避免,如果想绕开这个机制,常见的做法是在后台线程把图片绘制到CGBitmapContext中,然后从Bitmap直接创建图片。常见的网络图片库都自带这个功能。

9:图像的绘制:

图像的绘制通常是指用方法把图像绘制到画布中,然后从画布创建图片并显示。这个最常见的地方就是[UIView drawRect:]里面了,由于CoreGraphic方法通常都是线程安全的,所以图像的绘制可以很容易的放到后台线程进行,一个简单异步绘制的过程大致如下

- (void)display {

dispatch_async(backgroundQueue,^{

CGContextRef ctx = CGBitmapContextCreate(...);

CGImageRef img = CGBitmapContextCreateImage(ctx)

CFRelease(ctx);

dispatch_async(mainQueue,^{

Layer.contents = img;

})

})

}

CPU资源消耗原因和解决方案:相关推荐

  1. GPU 资源消耗原因和解决方案:

    GPU 资源消耗原因和解决方案: GPU能干的事情比较单一:接收提交的纹理Texture

  2. lum使用cgi处理PHP,php-cgi进程占用cpu资源过多负载高的原因分析及解决步骤

    服务器环境:redhat linux 5.5 , nginx ,  phpfastcgi 在此环境下,一般php-cgi运行是非常稳定的,但也遇到过php-cgi占用太多cpu资源而导致服务器响应过慢 ...

  3. [原]消耗CPU资源的shell脚本

    使用死循环消耗CPU资源,如果服务器是有多颗CPU,可以选择消耗多少颗CPU的资源: #! /bin/sh # filename killcpu.sh if [ $# != 1 ] ; thenech ...

  4. 消耗cpu资源的脚本

    具体步骤如下: 执行以下命令,打开位置,并创建脚本,如下图所示: cd /usr/sz/ sudo vim cpu_usage.sh 2. 输入脚本内容如下: FILE_NAME=`basename ...

  5. socket connect java_网络编程 – 为什么Java的socket.connect()消耗100%的cpu资源?

    我创建了一个线程池并为它提供了50个连接到服务器的任务.所以一旦完成连接,发送一些数据,然后断开连接.它的读取超时设置为5秒(当然是5000长).我甚至将线程池设置为最大大小为1.然后在 linux上 ...

  6. 深入浅出 Linux 惊群:现象、原因和解决方案

    hello, 大家好,我是Alex,今天分享一篇关于socket编程里面经典问题:惊群问题,文章深入分析了惊群问题的现象和其根本原因,并给出一些很好的解决方案,值得我们参考和学习,通过文章,我们可以学 ...

  7. mysql选错索引怎么解决_MySQL选错索引的原因以及解决方案

    MySQL 中,可以为某张表指定多个索引,但在语句具体执行时,选用哪个索引是由 MySQL 中执行器确定的.那么执行器选择索引的原则是什么,以及会不会出现选错索引的情况呢? 先看这样一个例子: 创建表 ...

  8. php-cgi占用cpu资源过高的解决方法

    转的网上的,不过对PHP-CGI菜鸟的人,还是有点帮助的. 1. 一些php的扩展与php版本兼容存在问题,实践证明 eAccelerater与某些php版本兼容存在问题,具体表现时启动php-cgi ...

  9. linux cpu占用100原因查询,如何根据查询异常时间节点和连接进而确定CPU使用率100%的原因...

    本文在介绍如何根据查询异常时间节点和连接进而确定CPU使用率100%的原因的基础上,重点探讨了其具体步骤,本文内容紧凑,希望大家可以有所收获. 排查 Linux 实例异常 CPU 使用率 100% 使 ...

最新文章

  1. php 字符串 中文,php实现中文字符串截取无乱码
  2. Java之关于面向对象
  3. 【机器学习】粗糙集属性约简—Attribute Reduction
  4. CentOS6网卡静态IP设置
  5. 怎么批量选择目标_全日制专升本一次可以报几个学校?目标院校应该怎么选择?...
  6. 硕士论文研究「AI预测性取向」:化妆等因素并不影响判断
  7. java小程序设计一个国旗点击国旗唱国歌,看这篇足矣了!
  8. c++opencv汉字分割_机器学习小白,还不快pick一下——【视觉与图像:阈值分割】...
  9. Java内存泄漏的介绍
  10. Python 学习笔记 - RabbitMQ
  11. 围棋软件测试自学,围棋软件等级棋力水平测试(正版)
  12. ubuntu虚拟机传文件到当前主机
  13. (二)mybatisPlus实现ActiveRecord(AR)操作
  14. Radio Dream流媒体直播平台基于Docker的应用
  15. openStack cluster chk
  16. 绿色下载:CYY屏幕截图助手1.3
  17. ICML 2020 | SCAFFOLD:联邦学习的随机控制平均
  18. 富格林金业:原油天然气怎么掌控买卖点?
  19. java 系统工具类 查询内存 CPU 系统基本信息 SysInfoUtils
  20. Scratch的克隆体

热门文章

  1. h3c路由器和三层交换机之间连接配置
  2. 如何用大学生身份申请GitHub学生包,免费使用github copilot
  3. RTSP安防网络摄像头/海康大华硬盘录像机网页无插件直播流媒体服务器EasyNVR证书配置页面按钮无法正常打开和关闭的问题解析
  4. 联发科AioT平台处理器i300介绍
  5. 最近调试HEVC中码率控制, 发现HM里面一个重大bug
  6. PPC r0-r31寄存器介绍
  7. 苹果AppStore被拒理由大全
  8. 秒杀系统(详解)基于SpringBoot实现(持续更新中)
  9. 当产品经理和程序员成为情侣后...
  10. .bat文件实现一个简单的http请求工具(支持get和post请求)