zoukankan      html  css  js  c++  java
  • iOS如何提高页面流畅度

    A.提高CPU性能

    对象创建
    1.尽量用轻量的对象代替重量的对象,比如CALayer 比 UIView 要轻量许多,如果不考虑交互事件的话,可以选择CALayer。
    2.Storyboard和xib加载对象时,消耗的成本比代码多。在使用时需要综合考虑。
    3.使用对象的预加载和懒加载,减少使用时加载的负担。

    对象调整
    1.UIView 的关于显示相关的属性(比如 frame/bounds/transform)等实际上都是 CALayer 属性映射来的,所以对 UIView 的这些属性进行调整时,消耗的资源要远大于一般的属性。不用频繁修改。
    2.UIView和CALayer层次的修改会激发很多代理和通知,尽量少去调整层次。

    对象的消耗
    1.对象容器型对象的消耗需要重视,尽量放到后台进行销毁。
    Tip:
    NSArray *tmp = self.array;
    self.array = nil;
    dispatch_async(queue, ^{
    [tmp class];
    });

    布局计算
    1.app内视图计算通常比较销毁CPU性能,而且算出的结果通常是修改uiview的frame相关属性,更是消耗cpu性能,所以尽量避免频繁的布局更新

    Autolayout
    1.自动布局对cpu的消耗随着复杂度是呈指数级的,故慎用

    文本计算
    1.页面的文本计算一般是无法避免的,自己手动计算可以提高性能

    文本渲染
    1.常见的文本控件 (UILabel、UITextView 等),其排版和绘制都是在主线程进行的,当显示大量文本时,CPU 的压力会非常大。
    对此解决方案只有一个,那就是自定义文本控件,用 TextKit 或最底层的 CoreText 对文本异步绘制。

    图片解码
    当用 UIImage 或 CGImageSource 的那几个方法创建图片时,生成的对象不会立即解码,而是当图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 GPU 前,CGImage 中的数据才会得到解码。解码都是在主线程中,影响性能。
    常见的做法是在后台线程先把图片绘制到 CGBitmapContext 中,然后从 Bitmap 直接创建图片。目前常见的网络图片库都自带这个功能。

    图像绘制
    1.图像的绘制通常是指用那些以 CG 开头的方法把图像绘制到画布中,然后从画布创建图片并显示这样一个过程。这个最常见的地方就是 [UIView drawRect:] 里面了。由于 CoreGraphic 方法通常都是线程安全的,所以图像的绘制可以很容易的放到后台线程进行。一个简单异步绘制的过程大致如下(实际情况会比这个复杂得多,但原理基本一致):
    - (void)display {
    dispatch_async(backgroundQueue, ^{
    CGContextRef ctx = CGBitmapContextCreate(...);
    // draw in context...
    CGImageRef img = CGBitmapContextCreateImage(ctx);
    CFRelease(ctx);
    dispatch_async(mainQueue, ^{
    layer.contents = img;
    });
    });
    }

    B.提高GPU性能
    纹理渲染
    1.当在较短时间显示大量图片时(比如 TableView 存在非常多的图片并且快速滑动时),CPU 占用率很低,GPU 占用非常高。避免这种情况的方法只能是尽量减少在短时间内大量图片的显示,尽可能将多张图片合成为一张进行显示。
    2.当图片过大,超过 GPU 的最大纹理尺寸时,图片需要先由 CPU 进行预处理,这对 CPU 和 GPU 都会带来额外的资源消耗。目前来说,iPhone 4S 以上机型,纹理尺寸上限都是 4096×4096。所以,尽量不要让图片和视图的大小超过这个值。

    视图混合
    1.当多个视图或者CALayer混合显示时,GPU会将它们混合到一起,如果视图多,结构复杂就会增加混合难度。解决方法:减少视图个数和层次,在不透明的视图中标明opaque 属性以避免无用的 Alpha 通道合成。或者把它们合成到一张大图上。

    图形生成
    1.CALayer 的 border、圆角、阴影、遮罩(mask),CASharpLayer 的矢量图形显示,通常会触发离屏渲染(offscreen rendering),而离屏渲染通常发生在 GPU 中。当一个列表视图中出现大量圆角的 CALayer,并且快速滑动时,可以观察到 GPU 资源已经占满,而 CPU 资源消耗很少。
    为了避免这种情况,可以尝试开启 CALayer.shouldRasterize 属性,但这会把原本离屏渲染的操作转嫁到 CPU 上去。另外解决方法是把需要显示的图形在后台线程绘制为图片,避免使用圆角、阴影、遮罩等属性。


    异步渲染框架
    AsyncDisplayKit,提高页面的流畅度

    参考文章:iOS 保持界面流畅的技巧 https://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

  • 相关阅读:
    Android 获取View在屏幕中的位置【转】
    算法学习资源 -- 2018年8月21日星期二
    Activity SingleInstance启动模式
    Android Studio添加aar依赖的两种方式
    Multiple dex files define Lcom/google/gson/internal/Streams$AppendableWriter$CurrentWrite;
    Android Studio添加aar依赖
    jdk-8u181-docs.chm -- 制作时间2018年8月12日
    大串中查找校串出现的次数(11)
    字符串反转(10)
    String类的替换方法(9)
  • 原文地址:https://www.cnblogs.com/zhou--fei/p/7662416.html
Copyright © 2011-2022 走看看