目标:
1.要达到什么样的流畅度(FPS达到60为优秀) FPS:1秒渲染多少帧
2.应用内存降到一个具体数字
方案: 可以通过两个的纬度考虑性能优化
CPU与GPU资源消耗原因以及解决办法
CPU:加载对图文布局
加载资源,对象创建,对象调整,对象销毁,图片解码,图片绘制,文本计算,文本渲染,布局计算,布局Autolayout
GPU:文视图
纹理渲染,视图混合,图形形成(三角,遮罩)
GPU的渲染性能比CPU高效很多,同时对系统的负载和消耗更低一些,所以,我们应该尽量让CPU负责主线程UI调动,图形显示相关工作交给GPU
软件性能优化:启动内存管理:4避免,3图片,NSAutoreleasepool/coreText ,网络优化
1.启动优化
2.内存管理
使用ARC,避免循环引用,CoreAnimation对象手动释放
3.避免主线程阻塞
永远不要使主线程承担过多
阻碍主进程的情形:1.网络同步请求2.I/0操作:读写外部资源3.大量运算4.解压缩
4.避免过于庞大的XIB
5.避免使用透明视图
透明对性能要求较高
6.避免离屏渲染
离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。离屏渲染意味着你App的部分区域每一帧渲染了两次。所以会造成一定的性能损失。
7.图片的处理
通常会用imageNamed:来加载mainbundle中的图片,此函数会缓存加载的image。因此,对于那些被重用的图片,这个API很高效。但是对于那些使用很少的图片,用这个就很耗内存。
使用一次的应用图片时使用initWithContentsOfFile:函数,加载多次使用的图片时就使用imageNamed:函数。
8.在Imageview中调整图片大小:
1. 如果要在UIImageview中显示本地资源图片,尽量保持大小一致,运行中缩放图片很消耗资源
2.如果图片是从远端服务加载的不能控制图片大小,最好缩放一次,然后在UIImageView中使用缩放后的图片
9.使用缓存/SDWebImage与Cache
因为数据具有时效的,所以对于时效性要求不高的数据完全可以使用缓存来保证快速显示。例如URL对应的图片缓存(SDWebImage),通过数据库活core Data来保存不需要变动的数据,UIWeb的缓存等都属于这种
10.NSAutoreleasepool
在临时创建大量对象时,使用NSAutoreleasepool,例如,一个循环用于创建包含多个对象的数组,在循环体内,即可使用@autoreleasepool包裹创建代码。使用系统的@autoreleasepool会有延迟,内存不会马上释放。
11.CoreText
对于排版复杂的文字或者图文混排,使用CoreText技术
12.减少Layer与视图层级
减少视图或者layer的层级数量,在有多个层级时,可以将多图合并成一张图,再渲染显示。
13.重用一些高消耗的对象
如NSDateFormatter、NSCalender等。解决方法:可以将其作为property、甚至是静态变量作为单例在APP中使用。并且,NSDateFormatter的 setDateFormate也是非常消耗资源的一个操作。网络传输过来的数据,往往是json或xml字符串。直接将这些字符串转换成我们需要的数据结构(自定义类或者NSDictionary),避免后续使用的时候还要做数据结构转换产生不必要的消耗。
14.关于后台运行
进入后台后,即尽量减少内存占用、释放所有的共享资源(如Calender或address book),因为iOS会kill后台中内存消耗最多的或者进入后台还占用共享资源的进程。
15.网络性能
网络性能优化涉及到DNS解析,路由算法,以及服务器端性能
携程网络优化策略
移动网络优化三要素
16.网络
1. Socket: 熟悉TCP/IP协议族,定义了主机如何连入因特网及数据束河在他们之间传输
应用层: HTTP SNMP FTP NDS
传输层: TCP UDP
网络层: IP
1.Socket描述了一个IP, 端口对。它简化了程序的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器来处理发送的这些消息。所以,socket一定包含了通信的双发,即客户端(Client)与服务器(server).
a: 服务端利用socket监听端口
b: 客户端发起连接
c: 服务端返回信息,建立连接,开始通信
d: 客户端,服务端断开连接
2.套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本单元;
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的进程。
多个TCP连接或者多个应用程序进程可能需要通过同一个TCP协议端口传输数据,为了区分不同的应用程序进程或连接
许多计算机系统为应用程序与TCP/IP协议交互提供了套接字(socket)接口,应用层和传输层通过socket接口,区分来自不同应用程序或者网络连接的通信,实现数据传输的并发服务;
3. 建立socket连接至少需要一对套接字,其中一个运行于客户端(Clientsocket),另一个运行于服务器端(Serversocket);
套接字之间的连接分为三个步骤:服务器监听 客户端请求 连接确认。
4.创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
五、产生死锁的四个条件
1.互斥条件 2.占有等待 3.不可强行占有 4.循环等待
六、拥塞控制
某段时间,对网络中资源需求大于可用的造成拥塞
解决方案
1.慢开始:最初TCP建立连接后向网络发送大量数据包,很容易导致网络中路由器缓存空间耗尽
2.拥塞避免:每次访问结束让CWND增加一个,而不是一倍,增加的更加缓慢
3.快重传与快恢复算法