问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

2. 图像显示原理

发布网友 发布时间:2022-10-21 09:47

我来回答

1个回答

热心网友 时间:2024-07-30 14:03

Layout:UI布局 文本计算
Display:绘制(drawRect)
Prepare:图片编解码
Commit:提交位图

图层的合成 ,纹理渲染,GPU渲染管线的过程:实际上这个过程指的就是OpenGL的渲染管线
渲染5步:

渲染结束之后,就会把最终的像素点,提交到对应的帧缓冲区中。

最底层是图形硬件(GPU),通过CPU Driver 来调度;上层是OpenGL和CoreGraphics,提供一些接口来访问GPU,在上面是core animation 和core image,处理动画,图形,在上面就是UIKit

像素
即RGB,位图数据有时候被称为RGB数据;
alpha,透明度,透明度直接乘以rgb对应的值

图形合成
多个图层重叠之后,需要统一各个图层的rgb然后算出最后一个展示的rgb值来进行最后展示渲染

透明与不透明:

当源纹理是完全不透明的时候,目标像素就等于源纹理。这可以省下 GPU 很大的工作量,这样只需简单的拷贝源纹理而不需要合成所有的像素值。但是没有方法能告诉 GPU 纹理上的像素是透明还是不透明的。这也是为什么 CALayer 有一个叫做 opaque 的属性了。如果这个属性为 YES,GPU 将不会做任何合成,而是简单从这个层拷贝,不需要考虑它下方的任何东西(因为都被它遮挡住了)。这节省了 GPU 相当大的工作量。

如果你加载一个没有 alpha 通道的图片,并且将它显示在 UIImageView 上,会自动设置opaque 为 YES。

对齐与不对齐

如果几个图层的模版都是完美重合,那我们只要从第一个像素到最后一个像素都计算合成一下,但是如果像素没有对齐好,我们还需要额外进行额外的移位操作,合并原纹理上的像素

两种情况会导致不对齐出现: 缩放,当纹理的起点不在一个像素的边界上

离频渲染

用通俗的语言总结一下:当我们在设置某些UI视图的图层属性,如果说指令为在未预合成之前,不能用于直接显示的时候呢,那么就触发了离屏渲染。

离屏渲染的概念起源于GPU,那GPU层面上呢,如果在当前屏幕缓冲区之外新开辟一个缓冲区去进行渲染操作的话呢,那么就是离屏渲染。

何时会触发离屏渲染

为何要避免离屏渲染?

CPU 和 GPU 在做具体的渲染过程中做了大量的工作,而离屏渲染是发生在 GPU 层面上面的,使 GPU 层面上面触发了 OpenGL 多通道渲染管线,产生了额外的开销,所以需要避免离屏渲染。

标准回答:
在触发离屏渲染的时候,会增加 GPU 的工作量,而增加 GPU 的工作量很有可能会到导致CPU和GPU工作总耗时超出了16.7ms,那么可能就会导致UI的卡顿和掉帧,那么我们就要避免离屏渲染。

另一种回答:
会创建新的渲染缓冲区,会有内存上的开销
会有上下文的切换,因为有多通道渲染管线,要把多通道的渲染结果进行一个合成,那么就有GPU一个额外的开销。

CPU资源消耗分析

1、对象创建:对象的创建会分配内存、调整属性、甚至还有读取文件等操作,比较消耗CPU资源。尽量采取轻量级对象,尽量放到后台线程处理,尽量推迟对象的创建时间。(如UIView / CALayer)

2、对象调整:frame、bounds、transform及视图层次等属性调整很耗费CPU资源。尽量减少不必要属性的修改,尽量避免调整视图层次、添加和移除视图。

3、布局计算:随着视图数量的增长,Autolayout带来的CPU消耗会呈指数级增长,所以尽量提前算好布局,在需要时一次性调整好对应属性。

4、文本渲染:屏幕上能看到的所有文本内容控件,包括UIWebView,在底层都是通过CoreText排版、绘制为位图显示的。常见的文本控件,其排版与绘制都是在主线程进行的,显示大量文本是,CPU压力很大。对此解决方案唯一就是自定义文本控件,用CoreText对文本异步绘制。(很麻烦,开发成本高)

5、图片解码:当用UIImage或CGImageSource创建图片时,图片数据并不会立刻解码。图片设置到UIImageView或CALayer.contents中去,并且CALayer被提交到GPU前,CGImage中的数据才会得到解码。这一步是发生在主线程的,并且不可避免。SD_WebImage处理方式:在后台线程先把图片绘制到CGBitmapContext中,然后从Bitmap直接创建图片。

6、图像绘制:图像的绘制通常是指用那些以CG开头的方法把图像绘制到画布中,然后从画布创建图片并显示的一个过程。CoreGraphics方法是线程安全的,可以异步绘制,主线程回调。

GPU资源消耗分析

1、纹理混合:尽量减少短时间内大量图片的显示,尽可能将多张图片合成一张进行显示。

2、视图混合:尽量减少视图层次和数量,并在不透明的视图里标明opaque属性以避免无用的Alpha通道合成。

3、图形生成:尽量避免离屏渲染,尽量采用异步绘制,尽量避免使用圆角、阴影、遮罩等属性。必要时用静态图片实现展示效果,也可尝试光栅化缓存复用属性。

4、 比如视图层级十分复杂,那GPU需要合成每一个对应像素点的像素值,做大量的计算,这个合成过程也会变得复杂。减轻视图层级的复杂性,会减轻GPU合成视图时的压力。 包括CPU的异步绘制机制,来达到提交的位图本身就是一个层级非常少的视图,这样也可以减轻GPU的压力。

如果UIView实现了方法
方法: - (void)displayLayer:(CALayer*)layer;
就会进行异步绘制,反之,走系统绘制;

调用 UIView 的setNeedsDisplay之后并没有立即执行当前视图的绘制工作,而是在调用时立即调用当前view 的 layer 的同名方法,于是在当前 layer 上打上了一个脏标记,在当前 runloop快要结束的时候才会调用CALayer display方法,然后才会进行当前视图真正的绘制流程。

drawLayer: inContext: 实现了这个方法,就不会再去走 drawRect:,没实现就直接走drawRect:

屏蔽drawLayer: inContext: 则会进入drawRect:方法。这里为什么要有个drawLayer: inContext:方法呢?为什么不直接drawRect:,我猜想可能是为了增加灵活性吧,drawRect:是UIView的一个方法,只能在UIView中调用。而drawLayer:inContext:则更加自由,是要实现了CALayer的代理的类都可以使用drawLayer: inContext:。

允许我们在系统的绘制之上,做一些其他的绘制工作

左侧是主队列,右侧是全局并发队列,假如我们在某一时机一个 View 调用了setNeedsDisplay这个方法之后呢,在当前 runloop 将要结束的时候呢,系统就会调用视图所对应 layer 的display方法。

如果我们的代理实现了displayLayer:这个函数的时候,会调用代理的displayLayer:这个方法,然后会通过子线程的切换,在子线程中进行位图的绘制。主线程这会就可以做一些其他的工作。

子线程在全局并发队列中所做的工作:

之后再回到主队列当中,提交这个位图,设置给 CALayer 的contents属性,这样就完成了一个UI控件 的异步绘制过程

是否受到CPU或者GPU的*?
是否有不必要的CPU渲染?
是否有太多的离屏渲染操作?
是否有太多的图层混合操作?
是否有奇怪的图片格式或者尺寸?
是否涉及到昂贵的view或者效果?
view的层次结构是否合理?

2. 图像显示原理

1、纹理混合:尽量减少短时间内大量图片的显示,尽可能将多张图片合成一张进行显示。2、视图混合:尽量减少视图层次和数量,并在不透明的视图里标明opaque属性以避免无用的Alpha通道合成。3、图形生成:尽量避免离屏渲染,尽量采用异步绘制,尽量避免使用圆角、阴影、遮罩等属性。必要时用静态图片实现展示效果...

Flash动画中根据图像显示的原理不同,图像可以分为哪两种

两种图像显示的原理不同,位图是由一个个像素点组成,把图像放大后,会是一个一个的放大了的像素点,这时,图像边缘会不圆滑,出现矩齿状,即我们常说的马赛克。起放大起明显。而矢量图中间的色彩和线条,是经过计算机计算得出的,它们不会由于放大图形而出现形变。所以矢量图放大后仍是清晰的。两者相比,前者色彩可以相当...

家用投影仪的原理家用投影仪有什么功能

2、原理二:使用图像显示元件,分别产生红、绿、蓝三色图像,然后通过合成进行投影。图像显示元件包括3类。其中采用液晶的有2类,分别是采用光透过型液晶的透过型液晶元件和采用可反射光的反射型液晶的元件。后一种元件是DMD(数字微镜元件),每个像素使用一个微镜,通过改变反射光的方向来生成图像。二、...

图像二进制原理 图像二进制化是如何进行的

1、二进制图片是指图片是二进制文件,图片保存在磁盘是二进制文件。实际就是称作文本文件。它在磁盘保存时也是一种二进制文件。计算机的存储在物理上是都二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。2、通过分割从彩色图像生成二进制图像。分割...

CRT彩色显示器呈现彩色的原理

原理:CRT显示器是靠电子束激发屏幕内表面的荧光粉来显示图像的,由于荧光粉被点亮后很快会熄灭,所以电子枪必须循环地不断激发这些点。首先,在荧光屏上涂满了按一定方式紧密排列的红、绿、蓝三种颜色的荧光粉点或荧光粉条,称为荧光粉单元,相邻的红、绿、蓝荧光粉单元各一个为一组,学名称之为像素...

查看图片时,图片放大,缩小显示是什么原理,会不会丢失像素?

缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。对图像的缩放操作并不能带来...

电子显微镜成像原理

1、吸收像:当电子射到质量、密度大的样品时,主要的成相作用是散射作用。样品上质量厚度大的地方对电子的散射角大,通过的电子较少,像的亮度较暗。早期的透射电子显微镜都是基于这种原理。2、衍射像:电子束被样品衍射后,样品不同位置的衍射波振幅分布对应于样品中晶体各部分不同的衍射能力,当出现...

投影仪的成像原理

2、投影仪利用这个原理可以达到利用电信号准确控制通过液晶单元的光线的目的。 液晶投影仪中的光源是金属卤素灯或UHP(冷光源),发出明亮的白光, 经过光路系统中的分光镜,将白光分解为RGB(红色、绿色、蓝色)三种元素颜色的光线。3、RGB三种元素颜色的光线在精确的位置上穿过液晶体,这时候每一个液晶体...

照相机的成像原理

照相机的成像原理是什么1、取景:光线(影像)通过镜头,投射到45度安放的反光镜上,折射到机顶的五菱镜,再通过五菱镜的两次折射,投射到取景目镜。拍摄者即通过目镜看到了与实物一样的正立的影像。 2、拍摄:摄者按下快门,反光镜向上翻起,打开镜头通向胶片(或CCD或CMOS)的光通路,反光镜同时将通向五菱镜的光路遮挡,...

液晶的显示原理

图像显示原理 屏幕显示图像的原理 手机屏幕显示图像原理 电视机显示图像原理 液晶显示器显示原理 电视不显示图像是什么原因 显示器成像原理 电脑图片显示原理 图像原理
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
沈阳大道教育的老师看起来比较年轻,教学经验丰富吗? 为什么老师教学经验越丰富,教学效果越差劲 广联达bim使用教程 一个人怎么拍摄视频 电动窗帘轨道卡住了怎么办 7岁儿童牙齿钙化怎么办 牛皮纸压泡纸机 去女友家送花选什么,拜访女友家送花推荐 新买的笔记本硬盘直接换上就可以用吗? 五色饭富含哪些营养价值 壮家人喜爱五色饭把它作为什么的象征_百度知 ... 茆诗松的人物成就 常德夷望溪风景区怎么样 用win7系统,自己建设一个无线网络,显示ipv6无网络访问权限是什么原因... WINDOWSXP建立一个新的用户,原来的administrator会消失,怎么才不让它... 为什么我在WINDOWS建个新用户,再启动机器时原来的用户就消失了?_百 ... 为什么我在Windows下新建一个用户后,用这个用户登录时QQ空间打开的和... 原来没建windows用户,但我小心建了一个windows用户桌面上原来的东西全... windowsXP新建一个用户却无法进行网络连接,急求解决办法! ...右键 “新建”没有任何的的项目了,使用windows 优化大师 无效,跪求... 真空包装以后,糖醋藕可以放多久,不放冰箱 真空包装的碗莲种藕可以存放多久 短文读后感 唯美句子作文素材 白粥怎么做粘稠 熬粥如何才浓稠? 梦见病人开车这样吉祥吗 梦见病人开车这样吉祥吗大哥是开车的,现病得好历害,我梦见他开着着他... 梦见病人开大货车到很远的地方? 中国云来市在哪个省? 模拟人生畅玩版在非凡画作前激动万分怎么做? 手机不是vivo但要怎么下载vivo游戏客户端 怎样改图像显示 闪付怎么存款 往闪付卡里面存的钱叫什么啊,是用于公交支付的,怎么往里面存钱,闪 有谁知道闪付能最高能存多少钱?除了银行柜台和ATM机存钱还有没有什么地... 倪妮和陈坤真的只是兄妹关系吗? 分手已婚女情人说:我们只是兄妹关系,不能回到从前了,伤心彻底了_百度知 ... 一个男生对别人说,和一个女生只是兄妹关系,说明了什么 如果有一个人告诉你,你跟他只是兄妹关系,没有情侣关系,你会怎� ...我认他做哥哥,只是兄妹关系,男朋友会介意这些么 怎么样让他知道我们只是兄妹关系 末伏的第一天吃什么 末伏的第一天吃什么食物好 梦见路滑 手机报编辑 具体做什么工作? 可以改手机号码吗 可以改手机号码吗? 绑定的手机号可以换吗 意境很美的现代诗歌 我在财付通绑定的银行卡丢失了,现在补办了一张,但是卡号变了,会影响转... 财付通的银行卡丢了可以修改吗? 银行卡丢失,网银和财付通都有钱,申请挂失后,补办的新卡,钱还能转回来吗...