当前位置: 首页 > 科技观察

iOS开发中常见的性能优化技巧

时间:2023-03-13 01:15:16 科技观察

造成性能问题的主要原因有哪些?原因有相同也有不同,但归根结底无非是内存占用、代码效率、合适的策略逻辑、代码质量、安装包大小等问??题。但是从用户体验的角度来说,当我们身为用户,处于不得不去玩一个app的情况下,我们关心什么呢?如果你是玩手游,首先不想突然闪退,然后不想卡顿,其次不想耗费太多电量和流量,最后我希望安装包更小。简单分类如下:快速:使用时避免卡顿,响应速度快,减少用户等待时间,满足用户期望。稳定性:用户在使用过程中不会死机和无响应。省:省流量省电,降低用户成本,使用时避免热手机。小:小的安装包可以降低用户的安装成本。1、快应用启动慢,使用时经常卡顿,极大影响用户体验,应尽量避免。卡顿的场景有很多,按照场景分为4类:UI绘制、应用启动、页面跳转、事件响应。卡顿的原因有很多,但不管是什么原因和场景,最终的结果都是通过设备屏幕上的展示到达用户。归根结底还是显示器有问题。根据iOS系统的显示原理,可以看出影响绘制的根本原因是以下两个方面:绘制任务太重,绘制一帧内容耗时过长。主线程太忙,根据系统传来的VSYNC信号,数据还没有准备好,导致丢帧。画图时间太长,有一些工具可以帮助我们定位问题。如果主线程太忙,就需要注意了。主线程的主要职责是处理用户交互、在屏幕上绘制像素以及加载和显示相关数据。因此,特别有必要避免任何主线程,以便应用程序可以维护用户操作。即时响应。总结一下,主线程主要做了以下工作:UI生命周期控制系统事件处理消息处理界面布局界面绘制界面刷新另外尽量避免将其他处理放在主线程中,尤其是复杂的数据计算和网络请求etc.2.稳定的应用稳定性的定义很广,影响稳定性的原因有很多,比如内存使用不合理,代码异常场景考虑不周全,代码逻辑不合理等,都会影响稳定性的应用程序。两种最常见的情况是:崩溃和ANR。这两个错误将使程序无法使用。比较常见的解决方案如下:提高代码质量。比如开发时的codereview,看代码设计逻辑,业务合理性等。代码静态扫描工具。常用工具有ClangStaticAnalyzer、OCLint、Infer等。崩溃监控。及时记录一些崩溃信息和异常信息,以便后续分析解决。崩溃上传机制。崩溃后,先尝试将日志保存在本地,等下次网络正常后再上传日志信息。3、省电在移动设备中,电池的重要性不言而喻,没有电就什么都做不了。对于操作系统和设备开发者来说,功耗优化一直没有停止,追求更长的待机时间,而对于一个应用来说,不能忽视功耗问题,尤其是那些被归类为“电池杀手”的应用。”应用,最终的结果就是要被卸载。因此,应用开发者需要在实现需求的同时,尽可能降低功耗。1、CPU无论用户是否直接使用,CPU都是应用程序使用的主要硬件。在后台运行和处理推送通知时,应用程序仍然会消耗CPU资源。应用程序计算的越多,它们消耗的电量就越多。对于基本操作,老一代设备消耗更多电量,消耗的计算量取决于不同因素2.网络智能网络访问管理可以使应用程序响应更快,有助于延长电池寿命。当无法访问网络时,应推迟后续的网络请求,直到网络连接恢复。此外,在没有WiFi连接的情况下,应避免进行高带宽消耗的操作。例如视频流,众所周知,蜂窝无线系统(LTE、4G、3G等)比WiFi信号消耗更多的功率。根本原因是LTE设备基于多输入多输出技术,使用多个并发信号来维护两端的LTE链路。同样,将定期扫描所有蜂窝数据链路以查找更强的信号。因此:我们需要1)在进行任何网络操作之前??检查是否有合适的网络连接可用2)持续监控网络的可用性并在链接状态发生变化时给予适当的反馈3)定位Manager和**GPS**我们都都知道定位服务是非常耗电的,使用GPS计算坐标需要确定两点信息:1)时间锁定每颗GPS卫星每毫秒广播一个唯一的1023位随机数,所以数据传输速率为1.024Mbit/秒。GPS的接收芯片必须正确对准卫星的时间锁槽。2)锁频GPS接收机必须计算接收机与卫星相对运动引起的多普勒频移引起的信号误差计算。坐标会持续占用CPU和GPS硬件资源,所以会很快消耗电池电量,那么如何减少呢?1)关闭不相关的功能,判断何时需要跟踪位置变化,需要跟踪时调用startUpdatingLocation方法,不需要跟踪时调用stopUpdatingLocation方法。当应用程序在后台运行或用户不与他人聊天时,也应关闭位置跟踪。也就是说,在浏览媒体库、查看好友列表或调整应用程序设置时应关闭位置跟踪2)仅在必要时使用网络为了提高用电效率,IOS始终保持无线网络关闭越多越好。当应用程序需要建立网络连接时,IOS会利用这个机会与后台应用程序共享网络会话,让一些低优先级的关键是每一级都可以处理,比如推送通知,接收邮件等.每当用户建立网络连接时,网络硬件会多维护几活动时间的秒数。每次集中的网络通信都会消耗大量的电能。为了减轻此问题造成的危害,您的软件需要使用预留网络。它应该在短时间内使用网络,而不是持续保持活跃的数据流。只有这样,网络硬件才有机会关机4.屏幕很耗电,屏幕越大越耗电。当然,如果你的应用程序在前台运行并与用户交互,势必会使用屏幕并消耗电量。以下是优化屏幕使用的一些解决方案:1)动画优化当应用程序在前台时,使用动画,一旦应用程序进入后台,立即暂停动画。一般来说,可以通过监听UIApplicationWillResignActiveNotification或UIApplicationDIdEnterBackgroundNotification的通知事件来使用UIApplicationDidBecomeActiveNotification的通知事件来暂停或停止动画,也可以通过监听UIApplicationDidBecomeActiveNotification的通知事件来恢复动画。是的,它会阻止屏幕进入休眠状态,这样它就会一直亮着。类似于动画,可以通过对应应用的通知来释放和获取锁。移动电源并非随处可用。当任务的复杂度无法降低时,提供对电池电量敏感的解决方案,并在适当的时候提示用户,会让用户体验更好。4、小应用安装包的大小对应用的使用没有影响。但是,应用的安装包越大,用户下载的门槛就越高。尤其是在移动网络的情况下,用户在下载应用时对安装包大小的要求更高。因此,减小安装包的大小可以让更多的用户愿意下载和体验产品。减重减负当然好,但是需要注意减重对项目可维护性的影响。建议根据自己的项目选择技能。App安装包由资源和可执行文件组成。安装包从以下三个部分进行精简和优化。资源优化:删除无用资源删除重复资源无损压缩图片不常用资源,替换为下载编译优化:去除调试符号启用编译优化,避免编译多架构可执行文件优化:去除无用代码统计库占用,去除无用库混淆类/方法名减少冗余字符串ARC->MRC(一般情况下不建议这样做,除非有特殊情况,会增加维护成本)减少iOS安装包大小是很多中大型APP不得不做的事情做。一般资源会先从文件入手,压缩图片/音频,去掉不需要的资源。这些资源优化完成后,我们还可以尝试将可执行文件瘦身。项目越大,可执行文件占用的体积越大,由于AppStore对可执行文件进行了加密,可执行文件的压缩率较低。压缩后的可执行文件约占整个APP安装包体积的80%~90%,值得优化。以下是一些常见的优化方案:TableViewCellreuse只在回调cellForRowAtIndexPath:时创建实例,快速返回cell,不绑定数据。在willDisplayCell:forRowAtIndexPath:处绑定数据(赋值)。当高度缓存在tableView中滑动时,会不断调用heightForRowAtIndexPath:。当cell的高度需要自适应时,每次回调都要计算高度,会导致UI卡顿。为了避免重复无意义的计算,需要缓存高度。如何缓存?字典,NSCache。UITableView-FDTemplateLayoutCell[if!supportLineBreakNewLine][endif]视图层级优化在内存可控的前提下不要动态创建视图和缓存子视图。善用隐藏。[if!supportLineBreakNewLine][endif]降低视图层级,减少子视图数量,使用layer绘制元素。少用clearColor、maskToBounds、阴影效果等。[if!supportLineBreakNewLine][endif]减少不必要的绘图操作。不要将JPEG图像用于图像。应使用PNG图像。子线程预解码(Decode),主线程直接渲染。因为当image没有Decode时,直接赋值给imageView会进行一次Decode操作。优化图片大小,尽量不要动态缩放(contentMode)。将尽可能多的图片组合成一张进行展示。[if!supportLineBreakNewLine][endif]减少透明视图和使用透明视图会导致混合。在iOS图形处理中,混合主要是指混合像素颜色的计算。最直观的例子就是我们将两层叠加在一起。如果第一层是透明的,最后的像素颜色计算需要考虑第二层。这个过程就是混合。混合的原因:UIView的alpha<1。UIImageView的图片包含alpha通道(即使UIImageView的alpha为1,只要图片包含透明通道,还是会造成混合)。[if!supportLineBreakNewLine][endif]为什么混合会导致性能损失?原因很直观。如果图层不透明,系统可以直接显示图层的颜色。而如果图层是透明的,会造成更多的计算,因为需要包含另外一个图层来计算混合色。opaque设置为YES以减少性能消耗,因为GPU不会进行任何合成,而只是简单地从这一层复制。[if!supportLineBreakNewLine][endif]减少离屏渲染离屏渲染是指图片在绘制到当前屏幕之前,需要先渲染一次再绘制到当前屏幕。在OpenGL中,GPU屏幕渲染有以下两种方式:On-ScreenRendering即当前屏幕渲染,即GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行的。Off-ScreenRendering即离屏渲染,是指GPU在当前屏幕缓冲区外开辟一个新的缓冲区进行渲染操作。[if!supportLineBreakNewLine][endif]总结性能优化不是更新一两个版本就能解决的,是持续需求,持续集成,迭代反馈。在实际项目中,在项目初期,由于人力和项目完成时间的限制,性能优化的优先级比较低。项目投入使用后,需要提高优先级。在构建解决方案时,性能优化点也需要提早考虑,这体现了程序员的技术水平。当需要进行性能优化时,往往是从发现问题开始,然后分析问题产生的原因和背景,然后寻找最佳方案,最后解决问题。这也是日常工作中经常使用的处理方法。