尽量推迟对象创建的时间,并把对象的创建分散到多个任务中去。尽管这实现起来比较麻烦,并且带来的优势并不多,但如果有能力做,还是要尽量尝试一下。...尽管这两个方法性能不错,但仍旧需要放到后台线程进行以避免阻塞主线程。...文本渲染 屏幕上能看到的所有文本内容控件,包括 UIWebView,在底层都是通过 CoreText 排版、绘制为 Bitmap 显示的。...尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText 对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText...6.使用正确的API 使用正确的 API,是指在满足业务的同时,能够选择性能更优的API。
视图在层级关系中可以互相嵌套,一个视图可以管理它的所有子视图的位置。 在iOS中,所有的视图都是从UIView这个基类派生出来的。...CALayer类在概念上和UIView类似,也是一些被层级关系树管理的矩形块,也可以包含一些内容,并且管理子视图的位置。...只有赋CGImage的时候才能正确显示。...UIImage有一个CGImage属性,它返回一个CGImageRef,但是这个值不能直接赋值给CALayer的contents,因为CGImageRef不是一个真正的Cocoa对象,而是Core Foundation...上图设置的contentsRect是{0, 0, 0.5, 0.5} 事实上contentsRect设置一个负数的原点或者大于{1, 1}的尺寸也是可以的。这种情况下,最外面的像素会被拉伸。
图3.6 钟面,和不对齐的钟指针 你也许会认为可以在Interface Builder当中调整指针图片的位置来解决,但其实并不能达到目的,因为如果不放在钟面中间的话,同样不能正确的旋转...这使得你可以手动地重新摆放或者重新调整子图层的大小,但是不能像UIView的autoresizingMask和constraints属性做到自适应屏幕旋转。 ...但是这个方法不能让你以编码的方式动态地生成蒙板,也不能让子图层或子视图裁剪成同样的形状。 CALayer有一个属性叫做mask可以解决这个问题。...总得来讲,当我们视图显示一个图片的时候,都应该正确地显示这个图片(意即:以正确的比例和正确的1:1像素显示在屏幕上)。...在现实中,这个点通常是视图的中心(图5.11),于是为了在应用中创建拟真效果的透视,这个点应该聚在屏幕中点,或者至少是包含所有3D对象的视图中点。
这样,当帧率大于刷新频率时,帧率就会被迫跟刷新频率保持同步,从而避免“tearing”现象。总结一下,开启VSync的本质就是强制拉平我们的GPU每秒绘制的帧数和屏幕的刷新频率。...比如文本处理(包括尺寸计算和文本绘制)、图片处理(包括解码和绘制) 尽量在子线程计算文本尺寸,比如boundingRect方法的调用,可以放到子线程 dispatch_async(dispatch_get_global_queue...:nil]; }); 尽量在子线程对图片进行解码(UIImage只有在显示的时候才会解码,而这个操作一般是在主线程,所以容易造成卡顿) 说明:[UIImage imageNamed:@"xxx"]方式加载进来的图片是不能直接显示到屏幕上的...如果确定子视图大小和位置是固定的,那么避免在cell的layoutSubViews中设置子视图的位置和大小。因为tableView滚动时候会调用cell的layoutSubView方法。...只设置layer.masksToBounds = YES或者layer.cornerRadius大于0不会触发离屏渲染 (如果需要圆角,可以使用CoreGraphics绘制裁剪圆角或者让UI提供圆角图片
其中mView是一个View对象,在ViewRootImpl类中的mView是整个UI的根节点,实际上也就是PhoneWindow中的mDecor对象,即一个Activity所对应的一个屏幕(不包括顶部的系统状态条...2.保存当前画布的堆栈状态,并且在当前画布上创建额外的图层,以便接下来可以用来绘制当前视图在滑动时的边框渐变效果。 3.绘制当前视图的内容。 4.绘制当前视图的子视图的内容。...DecorView的onDraw方法 当前视图的内容绘制完成后,接着绘制子视图的内容,调用了dispatchDraw方法。 ?...调用drawChild方法 接下来循环遍历每一个子View,并调用drawChild方法绘制当前视图的子视图View: ?...需要注意的是:View绘制的画布参数canvas是由surface对象获得,意味着View视图绘制最终会绘制到Surface对象去。
尽量推迟对象创建的时间,并把对象的创建分散到多个任务中去。尽管这实现起来比较麻烦,并且带来的优势并不多,但如果有能力做,还是要尽量尝试一下。...尽管这两个方法性能不错,但仍旧需要放到后台线程进行以避免阻塞主线程。...文本渲染 屏幕上能看到的所有文本内容控件,包括 UIWebView,在底层都是通过 CoreText 排版、绘制为 Bitmap 显示的。...尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText 对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText...使用 concurrent queue 时不可避免会遇到这种问题,但使用 serial queue 又不能充分利用多核 CPU 的资源。
尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText...尽管这两个方法性能不错,但仍旧需要放到后台线程进行以避免阻塞主线程。...可以使用异步绘制的方式,在子线程绘制好获得image,然后交给主线程。...视图或图片的点数(point),不能换算成整数的像素值(pixel),导致显示视图的时候需要对没对齐的边缘进行额外混合计算,影响性能。...开启光栅化后会将图层绘制到一个屏幕外的图像,然后这个图像将会被缓存起来并绘制到实际图层的 contents 和子图层,对于有很多的子图层或者有复杂的效果应用,这样做就会比重绘所有事务的所有帧来更加高效。
尽管现在的设备大都是液晶显示屏了,但原理仍然没有变。 广告2.png QQ图片20180430210048.png 通常来说,计算机系统中 CPU、GPU、显示器是以上面这种方式协同工作的。...尽量推迟对象创建的时间,并把对象的创建分散到多个任务中去。尽管这实现起来比较麻烦,并且带来的优势并不多,但如果有能力做,还是要尽量尝试一下。...尽管这两个方法性能不错,但仍旧需要放到后台线程进行以避免阻塞主线程。...文本渲染 屏幕上能看到的所有文本内容控件,包括 UIWebView,在底层都是通过 CoreText 排版、绘制为 Bitmap 显示的。...尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText 对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText
时,其内部会自动创建CALayer图层对象(即UIView的关联图层),UIView调用drawRect:方法进行绘图,并且将所有的内容绘制到自己的图层上,绘制完毕后,系统会将图层拷贝到屏幕上,于是就完成了...视图的的职责就是创建并管理这个图层,以确保子视图在层级关系中添加或者被移除的时候,它们的关联图层也同样对应在层级关系树当中有相同的操作。...,默认1.0;1.0:以每个点1个像素绘制图片;2.0:以每个点2个像素绘制图片,Retina屏幕; maskToBounds(BOOL) clipsToBounds(BOOL) 超出边界的内容或者子视图是否显示...主动绘制 我们需要显式的调用-display方法;这不同于UIView,当图层显示到屏幕上时,CALayer不会自动重绘它的内容,CALayer把重绘的决定权交给了开发者; 2.绘制特点 尽管没有使用...masksToBounds属性,但示例中绘制的视图依然被裁剪了,这是因为通过CALayer绘制寄宿图并没有对超出边界外的内容提供绘制支持; 3.设置代理 CALayerDelegate不能是UIView
User Defined Runtime Attributes是一个不被看重但功能非常强大的的特性,它能够通过KVC的方式配置一些你在interface builder中不能配置的属性 当你希望在IB中作尽可能多得事情...不好的解决方案 * 使用下面的方式会强制Core Animation提前渲染屏幕的离屏绘制, 而离屏绘制就会给性能带来负面影响,会有卡顿的现象出现 ``` self.view.layer.cornerRadius...当你调用 setNeedsDisplay 方法时, UIKit 将会把当前图层标记为dirty,但还是会显示原来的内容,直到下一次的视图渲染周期,才会将标记为 dirty 的图层重新建立Core Graphics...)遍历子控件,重复前面的两个步骤 如果没有符合条件的子控件,那么就自己处理 事件响应者链 如果当前view是控制器的view,那么就传递给控制器 如果控制器不存在,则将其传递给它的父控件 在视图层次结构的最顶层视图也不能处理接收到的事件或消息...,则将事件或消息传递给UIWindow对象进行处理 如果UIWindow对象也不处理,则将事件或消息传递给UIApplication对象 如果UIApplication也不能处理该事件或消息,则将其丢弃
一个孩子节点不能有指向其父辈的指针 数据是单向的(某个节点只能访问其子节点的数据信息,而不能从父级获取) 这些限制使我们能够在随后的布局中「重新使用」一个片段。...(从上到下依次排列) 绘制视图view背景 :drawRect命令绘制大小为800x600(视图大小),颜色为白色的区块 绘制#「blue」 背景: drawRect命令在「以视图为参照物」的位置为(0...(从上到下依次排列) 绘制视图view背景 :drawRect命令绘制大小为800x600,颜色为白色的区块 绘制#「scrolll」 背景:drawRect命令在「以视图为参照物」的位置为(0,0)处绘制大小为...「以视图为参照物」的位置为(0,0)处绘制大小为75x200,颜色为「橘色」的区块 绘制#「orange」 行内文本:drawTextBlob命令在(0,0)处绘制I'm falling文本信息 属性树和绘制块关系如下...一个144x244的合成层 (拥有属性树的图块) drawTextBlob命令在(0,0)位置,绘制Hello world文本信息 平移(0,18) 围绕Z轴旋转顺时针旋转25度 drawRect命令绘制位于相对于视图
不能在后台工作 OpenGL ES应用程序移到后台时必须做额外的操作。 如果应用程序不正确地处理这些任务,它可能会被iOS终止。...要以Retina显示器的全分辨率绘制,您应该更改CAEAGLLayer对象的比例因子以匹配屏幕的比例因子。 当支持具有高分辨率显示器的设备时,您应该相应地调整应用程序的型号和纹理资源。...使用1.0到和屏幕比例因子之间的分数比例因子。比例因子1.5提供比1.0的比例因子更好的质量,但需要填充比缩放为2.0的图像更少的像素。...为您的渲染策略添加适当的视图或视图控制器对象。...如果渲染到Core Animation图层,请将包含图层的视图添加为窗口的子视图。
过渡绘制 屏幕上某一像素点在一帧中被重复绘制多次,就是过渡绘制。 下图中多个卡片跌在一起,但是只有第一个卡片是完全可见的。背后的卡片只有部分可见。...但是Android系统在绘制时会将下层的卡片进行绘制,接着再将上层的卡片进行绘制。但其实,下层卡片不可见的部分是不需要进行绘制的,只有可见部分才需要进行绘制。 ?...API来绘图以及对画布做一些操作,clipRect方法用来裁切画布上的一个矩形区域,该矩形区域用Rect对象来描述。...接着进行裁切,将内容视图未被挡住的部分区域裁切出来,并把裁切完的canvas交由子View进行绘制,这样,内容区域只有在裁切后的区域才会绘制,其他区域不进行绘制。...既然过渡绘制值一个像素点被绘制多次,我们只要保证图片或者背景颜色不要叠加在一起即可。正确的方式应该是尽量减少带背景的View产生重叠区域。如果重叠,使用canvas的clipRect进行裁切。
小福:小黑说的对,再问一个问题,视图大小指的是什么? 小白:视图大小是在视图在屏幕上显示的大小,也就是开发的时候通过layout_width与layout_heigh设置的? ...Android系统设计中Canvas是无穷大的,假如一个屏幕的大小是320 * 480 ,但是layout_width="480px", layout_heigh="800px",很明显视图的宽高大于实际屏幕大小...问题来了,视图的大小到底是屏幕上显示的大小,还是视图的实际大小(即使是超过了屏幕大小)? ...//子view决定自己的大小,但最大不能超过父view,模式为AT_MOST 39. resultSize = size; 40. ...随意指定其宽高),而getWidth是视图父视图指定当前视图可以在屏幕上显示的区域。
*)subview 参数 subview 被添加做子视图的视图对象 讨论 被子类重写用来执行额外的命令当子视图添加到接收者。...重写这个方法可以用来选择忽略一些他们不关心的对象 drawRect: 在接收者视图中绘制矩形 - (void)drawRect:(CGRect)rect 参数 rect 一个定义的需要绘制的矩形...)insertSubview:(UIView *)viewatIndex:(NSInteger)index 参数 view 插入的视图,这个值不能是nil index 子视图索引从0开始并且不能大于子视图的数量...3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕。...subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕; • 若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束;
如果我们想依照此图形来剪裁视图内容,我们可以把CAShapeLayer作为视图的宿主图层,而不是添加一个子视图(图层蒙板的详细解释见第四章『视觉效果』)。...它会绘制一个或多个图层的子图层,并在每个复制体上应用不同的变换。...如果修改代码让-hitTest:直接作用于colorLayer而不是呈现图层,你会发现当图层移动的时候它并不能正确显示。...但这并不意味着在iOS上就不能实现自定义的过渡效果了。这只是意味着你需要做一些额外的工作。...,但是不能对子图层正确地处理变换效果,而且对视频和OpenGL内容也不起作用。
过度绘制总面积(浅红色区域)不超过屏幕可视区域的1/4; 3.3 过度绘制的根源 过度绘制很大程度上来自于视图相互重叠的问题,其次还有不必要的背景重叠。...蓝色代表的是这一帧绘制 Display List 的时间。通俗来说,就是记录了需要花费多长时间在屏幕上更新视图。...[1240] 当你看到红色的线较高的时候,可能是由于你的视图重新提交了需要重新绘制导致的(比如屏幕从竖屏旋转成横屏后当前界面重新创建),或者是自定义的视图很复杂,绘制起来很麻烦,导致耗时过长。...“ CPU 计算成 GPU 能够识别并绘制的对象 ” 这个操作是在 DisplayList 的帮助下完成的。DisplayList 拥有要交给 GPU 栅格化渲染到屏幕上的数据信息。...但如果视图中的绘制内容发生变化时(比如不可见了),那之间的 DisplayList 就无法继续使用了,这时系统就会重新执行一次重新创建 DisplayList 、渲染DisplayList 并更新到屏幕上
步骤如下: 父视图提供一个大小并询问其子视图的大小。 子视图根据自己的信息,它会选择自己的尺寸,而父视图必须尊重这个选择。 然后父视图在其坐标空间中定位子视图。...在幕后,SwiftUI 执行第四步:尽管它将位置和大小存储为浮点数,但在渲染时,SwiftUI 会将所有像素舍入到最接近的值,这样我们的图形仍然清晰。...希望现在您可以理解为什么:background() 是布局无关的,所以它通过询问子对象需要多少空间并使用相同的值来确定需要多少空间。...,但由于它是布局中立的,所以可以以任何大小绘制。...这在以前可能会令人困惑,但一旦将 Frame 视为图像的父对象,这就完全有意义了: ContentView 提供了整个屏幕。 frame 报告它想要300x300。
配合Activity 从启动到布局绘制的简单分析 阅读 ? View的绘制.png 基本概念介绍 Activity:一个 Activity 是一个应用程序组件,提供一个屏幕,用户可以用来交互。...View:所有视图控件的基类 ViewGroup:View 的子类,是容器类控件,内部用于放置子View Window:概况了 Android 窗口的基本属性和基本功能(抽象类) PhoneWindow...如果参数类型是 AT_MOST 的时候,这个表示父布局给了一个值,当前的 View 的大小不能超过这个值。...// 核心代码 // count 是 child 的个数 for(int i=0;i<count;i++){ // 获取 child 的 LayoutParmas 这个对象有我们在 xml 中给...绘制 onDraw onDraw() 函数就是来绘制了,一般 ViewGroup 不会实现内部的方法,子控件才重写 onDraw() 方法。也是内部一层层分发绘制。
Z轴代表的是深度,垂直于屏幕的方向。具体来说,Z轴朝向屏幕的方向为正,远离屏幕的方向为负。...)、rotateZ(30deg) rotate3d(0,0,1, 30deg) 表示只在 Z 轴旋转 30 度,等效于 rotateZ(30deg) */ ## 5 transform-style...自然 flat 值就是不能够交汇咯。 只要CSS绘制3D图形,这个transform-style必须加上,perspective可以选择性的添加。...默认缩放比例为 1,当值大于 1 时,元素放大;当值小于 1 且大于 0.01 时,元素缩小。...*/ transform: perspective(100px) scaleZ(2); 原因就是没有产生近大远小,至少来说,必须要通过其他的变形函数产生近大远小才可以看到效果 正确示例: transform
领取专属 10元无门槛券
手把手带您无忧上云