iOS 提升iOS开发知识

在尝试异步绘制前,我去了解了这些iOS渲染知识

2019-11-06  本文已影响0人  太阳骑士索拉尔

前言

FPS

CPU

GPU

位图

像素点如何出现在屏幕上

pixels-software-stack

渲染参与者

6379271-f8367726caa19e8a

we are A!R!G!B!

  A   R   G   B   A   R   G   B   A   R   G   B  
| pixel 0       | pixel 1       | pixel 2   
  0   1   2   3   4   5   6   7   8   9   10  11 ...
  
这个格式经常被叫做 ARGB。每个像素占用 4 字节(32bpp),每一个颜色组件是1字节(8bpc).每个像素有一个 alpha 值,这个值总是最先得到的(在RGB值之前),最终红、绿、蓝的值都会被预先乘以 alpha 的值

如果我们有一个橙色,他们各自的 8bpc 就像这样: 240,99,24.一个完全不透明的橙色像素拥有的 ARGB 值为: 255,240,99,24,它在内存中的布局就像上面图示那样。如果我们有一个相同颜色的像素,但是 alpha 值为 33%,那么他的像素值便是:84,80,33,8.
  x   R   G   B   x   R   G   B   x   R   G   B  
| pixel 0       | pixel 1       | pixel 2   
  0   1   2   3   4   5   6   7   8   9   10  11 ...

合成

R = S + D * ( 1 – Sa )

结果的颜色 = 源色彩(顶端纹理) + 目标颜色(低一层的纹理) * (1 - 源颜色的透明度)

透明与不透明

Alpha,Hidden与Opaque区别

合成区别

对齐与不对齐

离屏渲染(Offscreen Rendering)

什么是离屏渲染(Offscreen Rendering)

CRT显示器

显示原理

离屏渲染原理

调试方式

5FAD78E6BB6CC85AD123A7F166D02A18 截屏2019-10-15下午8.33.40

iOS绘制

CALayer与UIView

<img src="https://tva1.sinaimg.cn/large/006y8mN6ly1g8jqfuqu0wj30eg03paam.jpg" alt="img" style="zoom:200%;" />

代码验证

//
//  MyView.m
//  TableView-Optimizing-ChemeDemo
//
//  Created by Kevin.J on 2019/11/2.
//  Copyright © 2019 姜凯文. All rights reserved.
//

#import "MyView.h"

@implementation MyView

-(void)drawRect:(CGRect)rect{
    NSLog(@"4MyView.before.drawRect.layer.contents %@",self.layer.contents);

//   CGContextRef context = UIGraphicsGetCurrentContext();
//   draw something

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"3MyView.after.drawRect.layer.contents %@",self.layer.contents);
    });
}

@end

  
//
//  ViewController.m
//  TableView-Optimizing-ChemeDemo
//
//  Created by Kevin.J on 2019/10/8.
//  Copyright © 2019 姜凯文. All rights reserved.
//

#import "ViewController.h"
#import "AsyncLabel.h"
#import "MyView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    //AsyncLabel *label = [[UILabel alloc] init];
    MyView* myView = [[MyView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"1MyView.after.drawRect.layer.contents %@",myView.layer.contents);
    });
    [self.view addSubview:myView];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"2MyView.after.drawRect.layer.contents %@",myView.layer.contents);
    });
}


@end
输出的顺序为:
4MyView.before.drawRect.layer.contents (null)
1MyView.after.drawRect.layer.contents <CABackingStore 0x7f9aa8f00ff0>
2MyView.after.drawRect.layer.contents <CABackingStore 0x7f9aa8f00ff0>
3MyView.after.drawRect.layer.contents <CABackingStore 0x7f9aa8f00ff0>

绘制细节

img

绘制时机

参考文章

  1. iOS性能优化(初级)
  2. iOS性能优化(中级)
  3. iOS性能优化(中级+): 异步绘制
  4. iOS绘制与渲染--CPU绘制
  5. iOS-CPU&&GPU分别做什么?
  6. CoreText是如何绘制文本的
  7. 【重读iOS】认识CALayer
  8. 为什么必须在主线程操作UI
  9. 异步绘制
  10. 位图:百度百科
  11. 绘制像素到屏幕上
  12. iOS开发-Alpha,Hidden与Opaque区别
  13. [技巧]UIView的hidden和alpha的妙用
  14. 关于离屏渲染
  15. iOS-离屏渲染详解
  16. 离屏渲染优化详解:实例示范+性能测试
  17. 浅谈iOS中的视图优化
上一篇 下一篇

猜你喜欢

热点阅读