美文网首页
iOS-性能优化

iOS-性能优化

作者: 00d1ed2b53ae | 来源:发表于2018-12-17 17:01 被阅读13次

一、优化CPU

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

例:把图片的解码操作放到子线程

UIImageView *imgeView = [[UIImageView alloc] init];

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        CGImageRef cgImage = [UIImage imageNamed:@""].CGImage;

        CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(cgImage) &
                            kCGBitmapAlphaInfoMask;
        BOOL hasAlpha = NO;
        if (alphaInfo == kCGImageAlphaPremultipliedLast ||
            alphaInfo==kCGImageAlphaPremultipliedFirst ||
            alphaInfo == kCGImageAlphaLast ||
            alphaInfo == kCGImageAlphaFirst) {
            hasAlpha = YES;
        }

        CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Host;

        bitmapInfo |= hasAlpha ? kCGImageAlphaPremultipliedFirst :
                            kCGImageAlphaNoneSkipFirst;

        size_t width = CGImageGetWidth(cgImage);
        size_t height = CGImageGetHeight(cgImage);

        //context
        CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 0,
                                                     CGColorSpaceCreateDeviceRGB(), bitmapInfo);

        // draw
        CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage);

        // get CGImage
        cgImage = CGBitmapContextCreateImage(context);

        // into UIImage
        UIImage *newImage = [UIImage imageWithCGImage:cgImage];

        // realease
        CGContextRelease(context);
        CGImageRelease(cgImage);

        // back to the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            imgeView.image = newImage;
        });

    });

二、优化GPU

  • 尽量减少视图数量和层次
  • 尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示
  • GPU能处理的最大纹理尺寸是4096*4096,一旦超过这个尺寸,就会占有用CPU资源进行处理,所以纹理尽量不要超过这个尺寸
  • 减少透明的视图,不透明的就设置 opaque 为yes
  • 尽量避免出现离屏渲染
image.png

三、卡顿检测

  • 卡顿,主要因为在主线程执行了耗时操作
  • 可以添加Observer到主线程RunLoop中,通过监听RunLoop状态切换的耗时,以达到监控卡顿的目的

这是一个用来监听卡顿的工具包:
https://github.com/UIControl/LXDAppFluecyMonitor

四、耗电优化

  • 尽可能少CPU/GPU功耗

  • 少用定时器

  • 优化IO操作

  • 不要频繁写入小数据,最好批量一次性写入

  • 数据量比较大时,使用数据库(SQLite、CoreData)

  • 网络优化(XML 、 JSON 、 protocol buffer)

  • 减少、压缩网络数据

  • 多次请求,结果一样的话,使用缓存

  • 使用断点续传

  • 网络不可用时,不要尝试执行网络请求

  • 设置合适的超时时间

  • 批量传输,减少请求数量

  • 如果只是快速确定用户位置 ,使用CLLocationManager的 requestLocation,定位完成会自动断电

  • 如果不是导航APP,尽量不要实时更新位置,定位完毕就关掉定位服务

  • 尽量降低定位精度,比如尽量不要使用精度最高的kCLLocationAccuracyBest

  • 需要后台定位时,尽量设置pausesLocationUpdatesAutomaticallyYES,如果用户不太可能移动的时候系统会自动暂停位置更新

  • 尽量不要使用 startMonitoringSignificantLocationChages,优先考虑 startMonitoringForRegion

  • 用户移动、摇晃、倾斜设备时,会产生动作 motion 事件,这些事件由加速计、陀螺仪、磁力计等三件检测。在不需要检测的场合,应该及时关闭这些硬件

作者:GeniusWong
链接:https://www.jianshu.com/p/c7dfb6cdb9bb
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

相关文章

  • iOS-性能优化深入探究

    iOS-性能优化深入探究 iOS-性能优化深入探究

  • iOS-性能优化深入探究

    iOS-性能优化深入探究 上图是几种时间复杂度的关系,性能优化一定程度上是为了降低程序执行效率减低时间复杂度。如下...

  • iOS-性能优化

    CPU优化 用轻量级的对象,比如用不到事件处理的地方,可以用CALayer取代UIView 不要频繁的修改UIVi...

  • iOS-性能优化

    面试题 你在项目中是怎么优化内存的? 优化你是从哪几方面着手? 列表卡顿的原因可能有哪些?你平时是怎么优化的? 遇...

  • iOS-性能优化

    一、优化CPU 尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALayer取代UIView; 不要频...

  • 待看文章

    内存相关 【基本功】深入剖析Swift性能优化 渲染相关 关于iOS离屏渲染的深入研究 线程相关 iOS-线程安全

  • iOS-优化App性能

    1.一定要处理内存警告.2.UITableViewCell 不要一直 alloc 和 dealloc, 这样最吃内...

  • 【iOS-性能优化二】启动优化

    APP的启动可以分为两种: 冷启动:从0开始启动APP 热启动:APP已经在内存中,在后台存活着,再次点图片 AP...

  • iOS-性能优化-卡顿优化

    一. CPU和GPU的作用 在屏幕成像的过程中,CPU和GPU起着至关重要的作用: CPU(Central Pro...

  • iOS-性能优化之内存优化

    iOS App 通常情况下的三种内存类型 Clean Memory Dirty Memory Compressed...

网友评论

      本文标题:iOS-性能优化

      本文链接:https://www.haomeiwen.com/subject/bjyckqtx.html