ios优化_ios启动优化 - CSDN
精华内容
参与话题
  • 项目中我是这样干的,多次点都OK
  • ios优化

    2019-03-06 06:51:56
    一、耗电量优化:(转自:http://www.jianshu.com/p/4555704f9696?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weibo) 1、合理使用NSDateFormatter 和 ...

    一、耗电量优化:(转自:http://www.jianshu.com/p/4555704f9696?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weibo) 1、合理使用NSDateFormatter 和 NSCalendar这种高开销对象 2、不要频繁的刷新页面,能刷新1行cell最好只刷新一行,尽量不要使用reloadData 3、选择正确的集合 NSArray,使用index来查找很快(插入和删除很慢) 字典,使用键来查找很快 NSSets,是无序的,用键查找很快,插入/删除很快 4.少用运算获得圆角,不论view.maskToBounds还是layer.clipToBounds都会有很大的资源开销,必须要用圆角的话,不如把图片本身就做成圆角 5.懒加载,不要一次性创建所有的subview,而是需要时才创建. 6.重用 可以模仿UITableView和UICollectionView,不要一次性创建所有的subview,而是需要时才创建.完成了使命,把他放入到一个可重用集合中 7.图片处理 图片与imageView相同大小,避免多余运算 可以使用整副的图片,增加应用体积,但是节省CPU 可调大小的图片,可以省去一些不必要的空间 CALayer,CoreGraphics,甚至OpenGL来绘制,消耗CPU 8.cache,cache,cache(缓存所有需要的) 服务器相应结果的缓存(图片) 复杂计算结果的缓存(UITableView的行高) 9.尽量少用透明或半透明,会产生额外的运算. 10.使用ARC减少内存失误,dealloc需要重写并对属性置为nil 11.避免庞大的xib,storyBoard,尽量使用纯代码开发 CPU层面 1.Timer的时间间隔不宜太短,满足需求即可 2.线程适量,不宜过多,不要阻塞主线程 3.优化算法,减少循环次数 4.定位和蓝牙按需取用,定位之后要关闭或降低定位频率

    展开全文
  • iOS APP优化

    2018-08-15 17:57:28
    项目结构和架构 1.项目结构 项目结构分为两大类,第一为项目中所使用的文件目录分类,第二为项目中使用的第三方库 项目文件目录分类 总体设计思路将项目的目录分为业务模块,功能模块,配置文件模块对业务模块采用...

    项目结构和架构

    1.项目结构

    项目结构分为两大类,第一为项目中所使用的文件目录分类,第二为项目中使用的第三方库

    项目文件目录分类

    总体设计思路将项目的目录分为业务模块,功能模块,配置文件模块对业务模块采用MVC的设计模式;

    业务模块:项目内有有几大业务模块就分几类,绝大部分项目都可以按照tabbar来划分业务模块,然后增加注册登录等,这就构成了业务模块,对每个业务模块采用MVC模式.

    功能模块:项目内所引用或者使用的功能模块,这块按照不同功能模块类进行细分,例如可以细分为分类、公共的UI组件,Utils文件(其中Utils文件可以包含网络,加密,common等文件)等等.

    配置文件模块:存放pch文件,常量,宏定义等全局共用的文件.

    可以用下图表示:

     

    项目第三方库

    优先推荐采用cocopods管理项目所引用到的开源库和私有库.

    2.项目架构

    项目逻辑基本都围绕了一条主线时,我们采用MVC已经可以很好的满足我们的需求,但是当业务逻辑日渐复杂的时候,我们单纯的采用Model View Controller这种编程模式已经不能很好的将业务逻辑与代码分离开,也就是解耦Decouple.

    为了更好的将ViewController解耦,产生了Model View ViewModel这种编程模式,ViewModel层其实做了一层Model与ViewController中间的桥接,有利有弊,该模式会产生很多胶水代码,但是配合响应式编程框架(如ReactiveCocoa或者RxSwift),可以做到最大程度的解耦。适合与自己实际项目业务复杂程度的模式才是好的编程模式

    如果项目业务很复杂、很多业务组件都通用,可以采用组件化编程,常用的一种就是采用CocoaPods将项目业务模块分拆成各种pod库,使用什么模块直接集成就好,再配合MVVM和响应式编程框架(如ReactiveCocoa或者RxSwift),可以做到最大程度的解耦。蘑菇街的组件化设计思路可以借鉴参考:https://www.cnblogs.com/oc-bowen/p/5885476.html

    程序健壮性

    ..

    1.在框架层面提供运行稳定性

    加强单位测试的重要性,单元与单元之间不具有强烈耦合性,合适运用MVC,工厂模式,等设计方法,封装,集成和多态的面向对象的思想,这些均是程序在框架层面的控制,虽然简单,但意义重大,可保证每次批量用例执行时,整体上的稳定可.

    2.在细节层面上的技巧提高健壮性

    属性修饰符的正确使用,对于类不同的属性选用合适的修饰符;

    合理布局函数的返回值,保证函数的值一直;

    必要情况下使用Try…Except…处理;

    从运行时角度出发,对可能存在的异常做消息转发等操作;

    细节层面上的东西很多,在此只列举1,2,还需在开发中总结积累.

    3.清理代码,去除冗余代码

    很多时候,我们的代码都是迭代开发的。往往会罗列一些无用的函数,引入一些无用的类库。这些内容貌似无意义,但却是代码中的隐患。可能在后续的类库更新或者函数变更中爆炸。所以,代码要保持清理,对于无用的引用和定义,要加以清除。

    崩溃处理

    1.检测上传崩溃信息

    利用友盟, bugly等第三方统计,或者自己编写的一套崩溃方法,上传崩溃日志,以便于对崩溃现象进行分析,改正.

    1. 针对崩溃现象的处理

    通过使用NSSetUncaughtExceptionHandler注册自己的异常处理回调,发生崩溃时让程序显示的从容一点,不会直接闪退,可以弹出自己的崩溃异常界面,可以参考Bilibili的界面,比如说前方遇到高能反应之类,程序需要重启之类的,不会让用户感觉到很突兀得闪退了,也可以在收到崩溃日志后手动维护Runloop. 下面是一个样例.

    // 1. 注册ExceptionHandler

    + (void)installUncaughtExceptionHandler {

       NSSetUncaughtExceptionHandler(&HandleException);

       signal(SIGHUP, SignalHandler);

       signal(SIGINT, SignalHandler);

       signal(SIGQUIT, SignalHandler);

       signal(SIGABRT, SignalHandler);

       signal(SIGILL, SignalHandler);

       signal(SIGSEGV, SignalHandler);

       signal(SIGFPE, SignalHandler);

       signal(SIGBUS, SignalHandler);

       signal(SIGPIPE, SignalHandler);

    }

    // 2. 处理崩溃信息

    void SignalHandler(int signal) {

       // 1. 获取调用栈

       // 2. 处理异常

       // 3. App保活

       BOOL isContiune = TRUE; // 是否要保活

       CFRunLoopRef runLoop = CFRunLoopGetCurrent();

       CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop);

       while (isContiune) {

           for (NSString *mode in (__bridge NSArray *)allModes) {

               CFRunLoopRunInMode((CFStringRef)mode, 0.001, true);

           }

        }

       CFRelease(allModes);

       signal(SIGABRT, SIG_DFL);

       signal(SIGILL, SIG_DFL);

       signal(SIGSEGV, SIG_DFL);

       signal(SIGFPE, SIG_DFL);

       signal(SIGBUS, SIG_DFL);

       signal(SIGPIPE, SIG_DFL);

    }

    2.利用热修复进行动态bug修复

    在工程中集成JSPatch,实现热修复功能

    APP性能调优,体验优化

    1.懒加载的合适使用

    懒加载适用于一些可能不会加载的页面,比如弹框、空数据页面之类的,使用得当可以避免内存暴涨,使用不好,比如在必定会弹出的页面中使用懒加载可能会在增加页面响应时间,所以使用懒加载一定要注意使用场景,避免产生副作用. 

    2.避免使用重绘

    重写drawRect 或者drawReact:inContext方法会默认创建一个图层上下文,图形上下文所需要的内存为图层宽* 图层高* 4字节,图层每次进行重绘时都需要抹掉内存重新分配,会产生巨大的性能开销

    3.用户体验

    UITableViewCell 使用不当造成滑动卡顿;

    减少cornerRadius,maskToBounds诸如造成离屏渲染的方法的使用;

    网络请求操作没有任何状态展示,比如加载框、按钮置灰等;

    网络请求设置合理的缓存策略;

    4.内存管理

    合理使用属性修饰符,避免僵尸对象和野指针的产生;

    利用aoturealese来降低内存峰值;

    利用instrucment的leak来检测是否存在内存泄露等问题;

    减少诸如imageNamed这类将导致内容永驻方法的使用;

    内存管理要注意的地方很多,此处只列举一二.

    5.选择合适的数据存储项

    针对不同的应用和用户数据采用不同的数据存储,具体的数据存储选项如下:

    NSUerDefaults, 使用XML, JSON, 或者plist, 使用NSCoding存档, 使用类似SQLite的本地SQL数据库, 使用Core Data;

    同时对于数据存储位置也要合理选择,对于不用用处的数据存放在document,library,cache中的位置要明确.

    6.加速启动时间

    应用启动时尽可能做更多的异步任务,比如加载远端或者数据库数据,解析数据;

    同时在预加载pch文件中减少引用;

    去掉不必要在启动过程中执行的业务和操作.

    7.关于webView的使用

    减少使用Web特性,尽量使用WKWebView来替代WebView的使用;这样能极大的降低内存消耗.

    8.合理运用多线程

    合理运用多线程来提交运行效率,避免主线程阻塞.

    其他方面

    1. 减少大量的第三方SDK的使用,尤其是臃肿庞大的SDK;
    2. 包上线时检查开发过程中弃用的图片资源,冗余代码,减少包体积;
    3. 项目中使用的图片在满足需求的条件下,尽量缩减存储大小;
    4. 通过编译项的选择减少包体积;
    展开全文
  • iOS性能优化

    2019-04-10 11:16:32
    CPU和GPU 1.在屏幕成像过程中,CPU和GPU起着至关重要的作用 CPU(Central Processing Unit,中央处理器) 对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片...2.在iOS中是双缓冲机制,有前帧...
    • CPU和GPU

    1.在屏幕成像过程中,CPU和GPU起着至关重要的作用

    CPU(Central Processing Unit,中央处理器)

    对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解

    码、图像的绘制(Core Graphics)

    GPU(Graphics Processing Unit,图形处理器)

    纹理的渲染

    2.在iOS中是双缓冲机制,有前帧缓存、后帧缓存

    • 卡顿产生的原因:

    卡顿解决的主要思路:

    尽可能减少CPU、GPU资源消耗(按照60FPS的刷帧率也就是一秒刷60次帧,每隔16ms就会有一次VSync信号)。

    当第三个垂直同步信号来了的时候就是要显示的时候,但是GPU还没有渲染好,所以就无法显示当前的页只能还是显示上一页所以就出现了卡顿,等下一个垂直信号出现的时候GPU才渲染好才能显示出来。

    ------------------------------------------------------------------------------------------------

    • 卡顿优化 - CPU
    • 尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALayer取代UIView
    • 不要频繁地调用UIView的相关属性,比如frame、bounds、transform等属性,尽量减少不必要的修改
    • 尽量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性
    • 用Autolayout设置frame 会比 直接设置frame 消耗更多的CPU资源
    • 图片的size最好刚好跟UIImageView的size保持一致
    • 控制一下线程的最大并发数量
    • 尽量把耗时的操作放到子线程:比如文本处理(尺寸计算、绘制);图片处理(解码、绘制)。

     

    • 卡顿优化 - GPU
    • 尽量避免断时间内大量图片的显示,尽可能将多张图片合成一张进行显示
    • GPU能处理的最大纹理尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU资源进行处理,所以纹理尽量不要超过这个尺寸
    • 尽量减少视图数量和层次
    • 减少透明的视图(alpha<1),不透明的就设置opaque为YES
    • 尽量避免出现离屏渲染(比如当前屏幕的缓冲区不够渲染用的那么就会在屏幕外再创建一个缓冲区用来渲染)

     

    离屏渲染: 1.在OpenGL中,GPU有2中渲染方式 On-Screen Rendering:当前屏幕渲染,在当前用于显示的屏幕缓冲区进行渲染操作 Off-Screen Rendering:离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作 2.离屏渲染消耗性能的原因 需要创建新的缓冲区 离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕 3.哪些操作会出发离屏渲染? 光栅化,layer.shouldRasterize = YES 遮罩,layer.mask 圆角,同时设置layer.masksToBounds = YES、layer.cornerRadius大于0 解决方案:考虑通过CoreGraphics绘制裁剪圆角,或者叫美工提供圆角图片 阴影,layer.shadowXXX 解决方案:如果设置了layer.shadowPath就不会产生离屏渲染

    • 卡顿检测

    1. 平时所说的“卡顿”主要是因为在主线程执行了比较耗时的操作

    2. 可以添加Observer到主线程RunLoop中,通过监听RunLoop状态切换的耗时,来达到监控卡顿的目的

     

    --------------

    耗电的主要来源: CPU处理,Processing 网络,Networking 定位,Location 图像,Graphics

    • 耗电优化
    • 尽可能降低CPU、GPU功耗
    • 少用定时器
    • 优化I/O操作(I/O操作就是文件的读写操作)
      • 尽量不要频繁写入小数据,最好批量一次性写入
      • 读写大量重要数据时,考虑用dispatch_io,其提供了基于GCD的异步操作文件I/O的API。用

    dispatch_io系统会优化磁盘访问

      • 数据量比较大的,建议使用数据库(比如SQLite、CoreData)
    • 网络优化
      • 减少、压缩网络数据
      • 如果多次请求的结果是相同的,尽量使用缓存
      • 使用断点续传,否则网络不稳定时可能多次传输相同的内容
      • 网络不可用时,不要尝试执行网络请求
      • 让用户可以取消长时间运行或者速度很慢的网络操作,设置合适的超时时间
      • 批量传输,比如:下载视频流时,不要传输很小的数据包,直接下载整个文件或者一大块一大块地下载。如果下载广告,一次性多下载一些,然后再慢慢展示。如果下载电子邮件,一次下载多封,不要一封一封的下载。
    • 定位优化
      • 如果只是需要快速确定用户位置,最好用CLLocationManager的requestLocation方法。定位完成后,会自动让定位硬件断电
      • 如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
      • 尽量降低定位精度,比如尽量不要使用精度最高的kCLLocationAccuracyBest
      • 需要后台定位时,尽量设置pausesLocationUpdatesAutomatically为YES,如果用户不太可能移动的时候系统会自动暂停位置更新
      • 尽量不要使用 startMonitoringSignificantLocationChanges(监控重要位置的变化)

     

     

    展开全文
  • iOS 性能优化(一)

    2018-09-20 11:19:11
    提前布局可以说是最重要的优化点了。其实在从服务端拿到 JSON 数据的时候,关于视图的布局就已经确定了,包括每个控件的frame、cell的高度以及文本排版结果等等,在这个时候完全可以在后台线程计算并封装为对应的...

    本文将从原理出发,解释卡顿发生的原理,然后会讲解项目中行之有效的几个优化点,以此作为日后的参考提醒。下面进入正题。

    屏幕显示图像原理
    这里写图片描述

    我们知道,CRT显示器的显示原理是用电子枪扫描荧光屏来发光。如上图所示,电子枪按照从左到右,然后从上到下的顺序扫描。当电子枪换到新的一行准备进行扫描时,显示器会发出一个水平同步信号;而当一帧画面绘制完成后,电子枪回复到原位准备画下一帧前,显示器会发出一个垂直同步信号。垂直同步信号的作用一方面是通知显示器回到第一行行首位置,另外一方面,也通知显卡,准备输出下一帧画面。现在已经是液晶显示器的时代了,不再使用电子枪扫描了,但是原理还是类似的,水平同步信号和垂直同步信号还是一样被使用的。

    计算机工作原理
    这里写图片描述
    CPU中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等,将数据经过总线传给GPU;
    GPU进行变换、合成、渲染,将数据经过总线提交给帧缓冲区(FrameBuffer);
    帧缓冲区(FrameBuffer)等待垂直同步信号 VSync,然后将缓冲区的内容显示到屏幕上。

    屏幕撕裂(Screen tearing)
    这里写图片描述
    当资源同时发生读写操作时,就会产生数据错乱,解决办法就是添加线程安全锁。同理,屏幕撕裂的产生原因及修复措施也类似。
    上述的简单的屏幕显示原理其实会产生这样一个问题:假设我们的显卡速度很快,每秒生产的帧数肯定要超过显示器刷新率。那么在实际数据处理过程中,缓冲区的数据,在被输出之前,就被显卡不断的刷新重写。但是缓冲区并不是“先清空再写入数据”,这太没有效率,而是采用“新数据覆盖老数据”的方式。
    假设这样一种情况,缓冲区已经有一副完整的帧画面(A帧),然后显卡生成了下一帧画面(B帧),新一帧的数据开始写入缓冲区,写到一半的时候,垂直同步信号来 了,于是缓冲区的数据被输出到显示器。但问题是,这时缓冲区的数据,是由一半A帧和一半B帧数据合成的。因此最终显示器上显示出来的画面就不是一副完整的 画面,这就是“画面撕裂”现象出现的原因。

    解决屏幕撕裂
    简单来说只要让帧缓冲区里的数据始终保持一副完整的画面就可以了。从技术角度出发,其实就是利用刚刚提到的垂直同步信号 VSync。
    具体说起来就是,当显卡生成了一副完整画面并写入了帧缓冲区之后,暂停!然后开始等待垂直同步信号,当得到垂直同步信号后,再继续渲染下一帧写入缓冲区。这样就可以保证在缓冲区的数据始终是一副完整的画面,不会出现前后帧混合的问题。

    卡顿产生原因
    这里写图片描述
    在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上。由于垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。

    从上面的图中可以看到,CPU 和 GPU 不论哪个阻碍了显示流程,都会造成掉帧现象。所以开发时,也需要分别对 CPU 和 GPU 压力进行评估和优化。

    CPU资源消耗原因及解决方式

    1. 提前布局

      提前布局可以说是最重要的优化点了。其实在从服务端拿到 JSON 数据的时候,关于视图的布局就已经确定了,包括每个控件的frame、cell的高度以及文本排版结果等等,在这个时候完全可以在后台线程计算并封装为对应的布局对象XXXTableViewCellLayout,每个cellLayout的内存占用并不是很多,所以直接全部缓存到内存中。当列表滚动到某个cell的时候,直接拿到对应的cellLayout配置这个cell的对应属性即可。当然,该有的计算是免不了的,只是提前算好并缓存,免去了在滚动的时候计算和重复的计算。

    2. 对象的创建

      对象的创建会分配内存、设置属性等,会消耗CPU资源。所以尽量使用轻量对象代替,比如能用CALayer的时候尽量不用UIView,敏感位置能不用IB尽量使用纯代码手写。推迟同一时间创建对象,推荐使用懒加载在需要使用时候创建对象。

    3. 对象的调整

      对象的调整也经常是消耗 CPU 资源的地方。这里特别说一下 CALayer:CALayer 内部并没有属性,当调用属性方法时,它内部是通过运行时 resolveInstanceMethod 为对象临时添加一个方法,并把对应属性值保存到内部的一个 Dictionary 里,同时还会通知 delegate、创建动画等等,非常消耗资源。UIView 的关于显示相关的属性(比如 frame/bounds/transform)等实际上都是 CALayer 属性映射来的,所以对 UIView 的这些属性进行调整时,消耗的资源要远大于一般的属性。对此你在应用中,应该尽量减少不必要的属性修改。当视图层次调整时,UIView、CALayer 之间会出现很多方法调用与通知,所以在优化性能时,应该尽量避免调整视图层次、添加和移除视图。

    4. 对象的销毁

      当前类持有大量对象时候,其销毁时候的资源消耗就非常明显。建议创建销毁的异步队列,将需要销毁的对象放到队列中销毁。

    5. AutoLayout

      Autolayout 对于复杂视图来说常常会产生严重的性能问题,AutoLayout相对低效的原因是隐藏在底层的命名为”Cassowary“的约束求解系统,随着视图数量的增长,Autolayout 带来的 CPU 消耗会呈指数级上升,当Cell内约束超过25个的时候,会降低滑动的帧率。

    6. 文本的计算以及渲染

      UI中存在大量的对于文本高度的适配,可以参考:用 [NSAttributedString boundingRectWithSize:options:context:] 来计算文本宽高,用 -[NSAttributedString drawWithRect:options:context:] 来绘制文本。尽管这两个方法性能不错,但仍旧需要放到后台线程进行以避免阻塞主线程。常见的文本控件 (UILabel、UITextView 等),其排版和绘制都是在主线程进行的,当显示大量文本时,CPU 的压力会非常大。解决办法是利用TextKit或者是CoreText自定义文本控件。

    7. 图片解码以及图像的绘制

      当你用 UIImage 或 CGImageSource 的那几个方法创建图片时,图片数据并不会立刻解码。图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 GPU 前,CGImage 中的数据才会得到解码。这一步是发生在主线程的,并且不可避免。如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到 CGBitmapContext 中,然后从 Bitmap 直接创建图片。目前常见的网络图片库都自带这个功能。一个最常见的地方就是 [UIView drawRect:] 里面了。由于 CoreGraphic 方法通常都是线程安全的,所以图像的绘制可以很容易的放到后台线程进行。

    8. 文件系统的调用

      NSFileManager获取一个目录获取文件信息,进行多次递归计算,stat几乎瞬间完成,NSFileManager耗时较长且消耗CPU。

    GPU 资源消耗原因和解决方式

    1. 纹理的渲染

      所有的 Bitmap,包括图片、文本、栅格化的内容,最终都要由内存提交到显存,绑定为 GPU Texture。不论是提交到显存的过程,还是 GPU 调整和渲染 Texture 的过程,都要消耗不少 GPU 资源。当在较短时间显示大量图片时(比如 TableView 存在非常多的图片并且快速滑动时),CPU 占用率很低,GPU 占用非常高,界面仍然会掉帧。避免这种情况的方法只能是尽量减少在短时间内大量图片的显示,尽可能将多张图片合成为一张进行显示。当图片过大,超过 GPU 的最大纹理尺寸时,图片需要先由 CPU 进行预处理,这对 CPU 和 GPU 都会带来额外的资源消耗。目前来说,iPhone 4S 以上机型,纹理尺寸上限都是 4096×4096,更详细的资料可以看这里:iosres.com。所以,尽量不要让图片和视图的大小超过这个值。

    2. 视图的混合

      当多个视图(或者说 CALayer)重叠在一起显示时,GPU 会首先把他们混合到一起。如果视图结构过于复杂,混合的过程也会消耗很多 GPU 资源。为了减轻这种情况的 GPU 消耗,应用应当尽量减少视图数量和层次,并在不透明的视图里标明 opaque 属性以避免无用的 Alpha 通道合成。当然,这也可以用上面的方法,把多个视图预先渲染为一张图片来显示。

    3. 纹理的渲染

      CALayer 的 border、圆角、阴影、遮罩(mask),CASharpLayer 的矢量图形显示,通常会触发离屏渲染(offscreen rendering),而离屏渲染通常发生在 GPU 中。当一个列表视图中出现大量圆角的 CALayer,并且快速滑动时,可以观察到 GPU 资源已经占满,而 CPU 资源消耗很少。这时界面仍然能正常滑动,但平均帧数会降到很低。为了避免这种情况,可以尝试开启 CALayer.shouldRasterize 属性,但这会把原本离屏渲染的操作转嫁到 CPU 上去。对于只需要圆角的某些场合,也可以用一张已经绘制好的圆角图片覆盖到原本视图上面来模拟相同的视觉效果。最彻底的解决办法,就是把需要显示的图形在后台线程绘制为图片,避免使用圆角、阴影、遮罩等属性。

    4. 其他
      数据分页加载、做好数据缓存、异步处理、避免离屏渲染

    总结

    性能优化这个东西其实很难形成一个具体的方案,为什么这么说?因为之所以称之为优化,是因为要在原有的代码基础上进行优化,原有的代码又有各式各样的原因导致需要依照现有代码来优化,而很难完全脱离现有的情况完全参照某一种的既定方案进行优化。假如说是完全参照某一种的方案优化的话,建议还是将某一个性能敏感的页面利用Texture进行完全重写,这样才能算是整体化一的利用了某一种方案。

    展开全文
  • iOS app瘦身优化之路

    千次阅读 2017-04-11 13:48:11
    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源。这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大,又...
  • 点击上方“iOS开发”,选择“置顶公众号”关键时刻,第一时间送达!作者:Hello_Vincent链接:https://juejin.im/post/5b72aaf46f...
  • iOS 优化UITableView的性能

    千次阅读 2017-01-11 12:31:13
    一、UITableviewcell的一些介绍UITableView的每一行都是一个UITableViewCell,通过dataSource的 tableView:cellForRowAtIndexPath:方法来初始化每⼀行UITableViewCell内部有个默认的子视图:contentView,contentView是...
  • iOS 优化ipa包,减小安装包大小

    千次阅读 2019-06-22 18:28:47
    utm_content=note&utm_medium=seo_notes&utm_source=recommendatio项目打包之后.ipa包的大小是118.9M,上传到App Store后iPhone6s上显示85.5M,下载时...
  • iOS 优化TableView技巧

    2018-03-26 15:51:47
    tableview 对于ios开发者来说,一定不会陌生,很多APP界面一定都会用到,关于tableview的文章,也不计其数。特别是优化tableview 的文章,一定要还好琢磨看看。就我项目中遇到的一点优化一张表。关键字:刷新。 刷新...
  • iOS编译速度优化

    万次阅读 2020-09-07 10:56:51
    优化点 一、优化工程配置 二、使用 CocoaPods 管理第三方库:利用 cocoapods 插件 cocoapods-packager 将任意的 pod 打包成 Static Library,省去重复编译的时间;(缺点是不方便调试源码,如果库代码反复...
  • iOS启动速度优化总结

    千次阅读 2020-04-20 15:01:27
    所以,针对APP启动时间的优化还是很有必要的。 关于APP启动时间的分析和优化可以以main()为分界点,分为main()方法执行之前的加载时间(pre-main time)和main()之后的加载时间。那么,如何定量的测量这两个阶段具体...
  • iOS如何做优化

    2018-05-07 10:31:29
    今天来讨论下整体项目优化 本文只是提供了可以从哪些方面进行优化,没有对每个方向提供可参考的思路。 有的时候还是需要结合业务逻辑进行 画了个图整理下 参考以下数据(图片来自网络,侵删) 应用首次...
  • iOS 如何优化项目

    千次阅读 2017-08-19 08:13:16
    这个时候我们就可以考虑完善和优化我们的项目了。从中可以运用到一些底层RunLoop或者Runtime的知识,熟能生巧总是没错的�� 1. 结构与架构 1.1 结构 这里说的结构大概有两点:1.文件目录分类 2.第三方库管理 1.1.1 ...
  • iOS启动优化

    千次阅读 2018-08-31 11:12:43
    今日头条iOS客户端启动速度优化 应用启动时间,直接影响用户对一款应用的判断和使用体验。头条主app本身就包含非常多并且复杂度高的业务模块(如新闻、视频等),也接入了很多第三方的插件,这势必会拖慢应用的...
  • 方法一: 第三方库 ...可以利用UIScrollViewDelegate代理很好的解决这问题- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decele
  • iOS性能优化-内存优化

    千次阅读 2018-09-12 16:22:25
    一、为什么需要内存优化 二、内存管理 三、常见问题 四、内存占用 五、检测工具 摘要 一、为什么需要内存优化 The easy answer is users have a better experience. Not only will your app launch faster....
  • iOS tableView的优化方案

    千次阅读 2018-09-19 16:32:39
    1.提前计算并缓存好高度,因为heightForRow最频繁的调用。 - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath; 2.异步绘制,遇到复杂界面,性能瓶颈时,可能...
  • Unity3D在IOS上的优化

    千次阅读 2014-08-27 17:16:43
    Renderer时,Unity会使用可见性裁剪和包围体更新的方法来优化角色的运动,而这种优化只有在角色仅含有一个Skinned Mesh Renderer时才会启动。 角色Material数量:2-3个 骨骼数量:小於30个 面片数量:300-1500 ...
  • iOS最全性能优化(下)

    千次阅读 2016-03-14 09:27:22
    续 性能优化(中) 22. 加速启动时间 快速打开app是很重要的,特别是用户第一次打开它时,对app来讲,第一印象太太太重要了。 你能做的就是使它尽可能做更多的异步任务,比如加载远端或者数据库数据,解析数据。 ...
1 2 3 4 5 ... 20
收藏数 106,615
精华内容 42,646
关键字:

ios优化