一、CPU与GPU交互
任何程序在运行时生成的数据会先存放在堆内存里,然后再依据具体情况往其他地方存放。我们要调用图形框架生成好的图形数据,也要先放在内存中,从硬件角度来看存放在RAM中,然后CPU不去直接计算渲染它,因为有一个更独立、强大的计算单元GPU来完成这件事。CPU运行APP过程中生成的
图形数据是要向GPU发送并且渲染的。
而在GPU中有一个内存单元专门用来存放图形数据,叫VRAM,也叫显存。从CPU发送过来的数据先存放在VRAM中,然后再由GPU独立计算并配合CPU完成渲染工作。
二、状态准备
把图形数据从RAM传递到VRAM[显存]
中,那图形数据是什么呢?其实是所有渲染所需的数据。可能包含文字、几何图形。如果是在3D建模的情况下,则还有可能包含一些复杂的数据模型。
当这些数据全部传递到VRAM中后,CPU还需要配合GPU来进行一些操作。首先CPU把数据传递过去,然后设置好数据的属性[颜色、线宽、形状填充颜色、文字格式等],接着就告诉GPU开始渲染了,GPU接收到指令之后,进行下一步操作。
三、坐标转换
GPU在接收到图形数据的同时,也接收到了渲染指令。这时他会对每一个图形的每一个坐标点进行转换,从虚拟空间转换到屏幕空间[CGPoint的转换]
。
四、计算像素
转换屏幕坐标系之后,我们依据所有坐标点来计算图形没条边的像素坐标,然后以此得出所要显示的图形边界。
得到边界以后,我们会逐个查看屏幕上的每个像素是否被这个图形覆盖。
通过遍历检查以后,会输出整个覆盖区域,此时再把所覆盖的区域的所有信息保存下来,进入下一步。
五、硬件显示
假如显示器是基于阴极射线管[CRT]
设计的,它通过电子枪的部件发射电子,经过处理变成电子束,然后用电子束去轰击屏幕表面涂抹的荧光粉,最后利用荧光粉被轰击后会变亮的特性来显示图形。
六、代码
//Core Animation的CAShapeLayer图层子类
- (void)drawingFirstMethod{
//创建路径
UIBezierPath *path = [[UIBezierPath alloc]init];
//向路径中添加一个圆
[path addArcWithCenter:CGPointMake(130, 150) radius:25 startAngle:0 endAngle:360 clockwise:YES];
//向路径中添加一个正方形
[path moveToPoint:CGPointMake(50, 50)];
[path addLineToPoint:CGPointMake(100, 50)];
[path addLineToPoint:CGPointMake(100, 100)];
[path addLineToPoint:CGPointMake(50, 100)];
[path addLineToPoint:CGPointMake(50, 50)];
//向路径中添加一个三角形
[path moveToPoint:CGPointMake(175, 50)];
[path addLineToPoint:CGPointMake(150, 100)];
[path addLineToPoint:CGPointMake(200, 100)];
[path closePath];
//新建一个图形图层,并设置图层属性
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = path.CGPath;
shapeLayer.lineWidth = 1.f;
shapeLayer.strokeColor = JHRGB(0, 0, 0).CGColor;
shapeLayer.fillColor = JHRGB(229, 229, 229).CGColor;
//向当前view的图层中添加新建的图层
[self.view.layer addSublayer:shapeLayer];
}
七、效果图