精华内容
下载资源
问答
  • 关于帧缓存的总结

    2012-05-19 16:16:00
    关于帧缓存的总结 本来想带上例子的,发现自己懂得太晚了,没必要了。写下自己的理解就行了。 1.缓冲区 缓冲区是一块内存或在相应硬件中开辟的空间,目的是为了保存像素数据中的相关信息。 根据缓存中不同的作用...

    关于帧缓存的总结

    本来想带上例子的,发现自己懂得太晚了,没必要了。写下自己的理解就行了。

    1. 缓冲区

     缓冲区是一块内存或在相应硬件中开辟的空间,目的是为了保存像素数据中的相关信息。

    根据缓存中不同的作用,和功能分为颜色缓冲、模板缓冲、深度缓冲、积累缓冲等(有的根据具体作用还有其他缓冲)。同意成称为 帧缓存!

    2. 概念、原理、OpengGL实现

         2.1颜色缓冲区

    颜色缓冲区的作用就是实现存储要显示在屏幕上的,经过管线处理变化后的颜色准备显示到屏幕上。颜色缓冲区主要包括:支持立体显示的左右缓冲区,支持动画的前后缓冲区(ps:动画这里表示实现在后缓冲区实现绘图后  通过交换缓冲区交换到前缓冲区,不再显示绘画过程)。 类似 辅助库auxSwapBuffers();实现的前后缓冲的交换。

     

         2.2深度缓冲区

    深度缓冲区保存像素的深度值。深度值是因三维世界的兴起而提出的,图形学中(在绘画专业估计早有此概念,毕竟好多算法实现都是从画家那里得来的)。深度缓冲区也叫Z-buffer 所以,每个像素的z坐标即为它的深度。

    深度缓冲在立体图形消隐等算法中广为应用。

     

        2.3模板缓冲区

    模板缓冲区作用比较奇特。模板的作用是实现渲染区域按照程序设计的方式实现。比如:如果让你实现在显然区域中一个小的正方形显示渲染,你可能会想到用剪切就行了。但是,如果让你实现一个五角星里面渲染呢? 这时候用 模板 最为方便。

    模板的应用过程就是在模板缓冲区内设定好要显示渲染的形状,开启目标测试,通过检测的像素渲染,没有通过的丢弃。就会出现想要的效果:在一个五角星里有我们渲染的东西,其他地方看不见。

        2.4积累缓冲区

    积累缓冲区字面意思,实现了颜色的积累实现一些特殊的效果。

    3. 缓冲区的操作

         3.1缓冲区的清除

    为了防止缓冲区内的数据对绘图的影响,在绘图之前要对缓冲区实行清除操作。

    过程: 首先设置清除值。如:

    设置颜色清除值 glClearColor(r,g,b,a)

    设置深度清除值 glClearDepth(dep)

    设置模板清除值 glClearStencil(int a);

               然后 设置清除项 glClear();

     

    参数包括 GL_DEPTH_BUFFER_BIT

    GL_COLOR_BUFFER_BIT

    GL_ACCUM_BUFFER_BIT

    GL_STENCIL_BUFFER_BIT

    以上几个参数可以 相互进行或后作为参数给glColor();

     

    3.2缓冲屏蔽

    所谓缓冲屏蔽,可以理解为缓冲区是否可写,当我们对缓冲区添加屏蔽时,并没有停止相应测试,而是缓冲区一直没有变。

     

    3.3测试

    http://bochuang.sinaapp.com/forum.php?mod=viewthread&tid=49&extra=page%3D1 

     

    转载于:https://www.cnblogs.com/leisure/archive/2012/05/19/2508955.html

    展开全文
  • 3D拾取(3D Picking)-帧缓存(FBO) 1、原理 以colorID颜色渲染几何物体,然后存储到离屏帧中 用户点击屏幕时,根据坐标在离屏帧中查看颜色 如果该颜色与colorID相同那么,用户点击的就是几何物体 2、步骤1-得到离屏帧 ....

    作者: DSLMing
    时间: 2019.11.3

    参考:
    FunWithWebGL2 024 Picking with Framebuffers

    3D拾取(3D Picking)-帧缓存(FBO)

    1、原理

    1. 以colorID颜色渲染几何物体,然后存储到离屏帧中
    2. 用户点击屏幕时,根据坐标在离屏帧中查看颜色
    3. 如果该颜色与colorID相同那么,用户点击的就是几何物体

    2、步骤1-得到离屏帧

    每帧的渲染函数,将目标物体以colorID颜色存储到离屏帧中。

    // 每次渲染要执行的函数
    onItemRendered = function (itm) {
      gShader.setUniforms("uColorID", colorID);
      Fungi.Shaders.FBO.activate(fbo);
      itm.draw();
      Fungi.Shaders.FBO.deactivate();
      gShader.setUniforms("uColorID", blankID);
    }
    

    这里渲染2次:

    • 渲染到离屏帧: 使用参数:colorID 设置 uColorID。
    • 渲染到屏幕: 使用参数:blankID 设置 uColorID。

    顶点着色器:

    const vec3 blankColorID = vec3(0.0,0.0,0.0);
    uniform vec3 uColorID;
    
    void main(void){
      if(uColorID != blankColorID)	color = uColorID;
      else if(a_position.w == 0.0)	color = vec3(1.0,0.0,0.0);
      else if(a_position.w == 1.0)	color = vec3(0.0,1.0,0.0);
      else	color = vec3(0.6,0.6,0.6);
      ...
    }
    

    这里每个顶点着色器也运行两次:
    离屏帧: color = uColorID
    屏幕帧: 立方体原本颜色。
    在这里插入图片描述

    3、步骤2-拾取判断

    // 当鼠标按下时
    setDownOverride(function (e, ctrl, x, y) {
      // 翻转y坐标
      var yi = Fungi.gl.fHeight - y
      // 根据点击坐标(x,y)在离屏帧中得到该像素
      var pixel = Fungi.Shaders.FBO.readPixel(fbo, x, yi)
      // 根据像素值得到颜色值
      var id = colorToID(pixel);
      // ignore Black and white.
      if (id == 0 || id == 16777215) return;
      // 点击区域的颜色与之前设置的 uColorID 相同,那么就拾取到了该对象
      ctrl.switchHandler("pick");
    });
    

    参考

    gl.readPixels 参考:WebGL 进入三维世界

    展开全文
  • 用rosbag录了一段数据,在rviz上...于是重新打开rviz,重新添加topic,这样不会缓存数据,然后又打开之前的.rviz配置,就不会缓存数据了。不知道原理是什么,作为暂时的解决方法吧。 还有一种方法,先放ba...

    用rosbag录了一段数据,在rviz上显示。

    rviz打开之前的一个配置.rviz后,突然就缓存多帧数据了,之前还好好的。

    把所有程序都关掉,然后重启roscore,还是缓存多帧数据,于是重启电脑,也还是不行。于是重新打开rviz,重新添加topic,这样不会缓存多帧数据,然后又打开之前的.rviz配置,就不会缓存多帧数据了。不知道原理是什么,作为暂时的解决方法吧。

    还有一种方法,先放bag数据,然后启动自己的一个计算程序,也可以解决这个问题,因为我之前是先启动计算程序,然后再放bag的。

    展开全文
  • 而我们的GPU则是负责对位图进行渲染,最后将渲染好的位图放到帧缓存区。由视频控制器在指定时间之前去帧缓冲区提取显示内容,通过显示屏显示出来。 举例说明 当我们创建一个UIView控件之后,它的显示部分由CALayer...

    图像显示的原理

    在这里插入图片描述
    关于CPU和GPU两个硬件都是通过总线连接起来的,CPU主要处理UI的布局和一些文本信息的计算以及整个绘制过程图片编解码,最后在合适的时机提交位图给GPU。而我们的GPU则是负责对位图进行渲染,最后将渲染好的位图放到帧缓冲区。随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。

    举例说明
    在这里插入图片描述

    1. 当我们创建一个UIView控件之后,它的显示部分由CALayer负责;
    2. CALayer当中有一个contents属性,就是我们要绘制屏幕当中的位图;比如说我们创建一个UILabel,contents里边放置的就是一个Hello World 的文本。然后系统会在一个合适的时机回调给我们一个drawRect:方法,在这个方法里我们可以绘制一些自定义图像;
    3. 绘制好的位图最终会通过CoreAnimation框架提交给GPU部分的OpenGL渲染管线,进行最终的渲染和纹理的合成,最终显示在屏幕上。

    CPU的工作原理及相关操作

    在这里插入图片描述

    GPU的原理及相关操作:

    在这里插入图片描述

    掉帧的本质

    在这里插入图片描述

    在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上。由于垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。

    所谓的掉帧或者卡顿是因为刷新帧率小于16.7ms(人眼的接受帧率为1秒60帧位图是不会出现卡顿现象),那么就是说一秒内要完成至少60个位图绘制渲染.当CPU计算或者绘制时间较长,导致GPU渲染加上CPU计算时间超过16.7ms就会出现卡顿、掉帧现象。

    滑动优化方案

    CPU 资源消耗原因和解决方案

    对象创建

    对象的创建会分配内存、调整属性、甚至还有读取文件等操作,比较消耗 CPU 资源。尽量用轻量的对象代替重量的对象,可以对性能有所优化。比如 CALayer 比 UIView 要轻量许多,那么不需要响应触摸事件的控件,用 CALayer 显示会更加合适。如果对象不涉及 UI 操作,则尽量放到后台线程去创建,但可惜的是包含有 CALayer 的控件,都只能在主线程创建和操作。通过 Storyboard 创建视图对象时,其资源消耗会比直接通过代码创建对象要大非常多,在性能敏感的界面里,Storyboard 并不是一个好的技术选择。

    尽量推迟对象创建的时间,并把对象的创建分散到多个任务中去。尽管这实现起来比较麻烦,并且带来的优势并不多,但如果有能力做,还是要尽量尝试一下。如果对象可以复用,并且复用的代价比释放、创建新对象要小,那么这类对象应当尽量放到一个缓存池里复用。

    对象调整

    对象的调整也经常是消耗 CPU 资源的地方。这里特别说一下 CALayer:CALayer 内部并没有属性,当调用属性方法时,它内部是通过运行时 resolveInstanceMethod 为对象临时添加一个方法,并把对应属性值保存到内部的一个 Dictionary 里,同时还会通知 delegate、创建动画等等,非常消耗资源。UIView 的关于显示相关的属性(比如 frame/bounds/transform)等实际上都是 CALayer 属性映射来的,所以对 UIView 的这些属性进行调整时,消耗的资源要远大于一般的属性。对此你在应用中,应该尽量减少不必要的属性修改。

    当视图层次调整时,UIView、CALayer 之间会出现很多方法调用与通知,所以在优化性能时,应该尽量避免调整视图层次、添加和移除视图。

    对象销毁

    对象的销毁虽然消耗资源不多,但累积起来也是不容忽视的。通常当容器类持有大量对象时,其销毁时的资源消耗就非常明显。同样的,如果对象可以放到后台线程去释放,那就挪到后台线程去。这里有个小 Tip:把对象捕获到 block 中,然后扔到后台队列去随便发送个消息以避免编译器警告,就可以让对象在后台线程销毁了。

    布局计算

    视图布局的计算是 App 中最为常见的消耗 CPU 资源的地方。如果能在后台线程提前计算好视图布局、并且对视图布局进行缓存,那么这个地方基本就不会产生性能问题了。

    不论通过何种技术对视图进行布局,其最终都会落到对 UIView.frame/bounds/center 等属性的调整上。上面也说过,对这些属性的调整非常消耗资源,所以尽量提前计算好布局,在需要时一次性调整好对应属性,而不要多次、频繁的计算和调整这些属性。

    Autolayout

    Autolayout 是苹果本身提倡的技术,在大部分情况下也能很好的提升开发效率,但是 Autolayout 对于复杂视图来说常常会产生严重的性能问题。随着视图数量的增长,Autolayout 带来的 CPU 消耗会呈指数级上升。

    文本计算

    如果一个界面中包含大量文本(比如微博微信朋友圈等),文本的宽高计算会占用很大一部分资源,并且不可避免。如果你对文本显示没有特殊要求,可以参考下 UILabel 内部的实现方式:用 [NSAttributedString boundingRectWithSize:options:context:] 来计算文本宽高,用 -[NSAttributedString drawWithRect:options:context:] 来绘制文本。尽管这两个方法性能不错,但仍旧需要放到后台线程进行以避免阻塞主线程。

    如果你用 CoreText 绘制文本,那就可以先生成 CoreText 排版对象,然后自己计算了,并且 CoreText 对象还能保留以供稍后绘制使用。

    文本渲染

    屏幕上能看到的所有文本内容控件,包括 UIWebView,在底层都是通过 CoreText 排版、绘制为 Bitmap 显示的。常见的文本控件 (UILabel、UITextView 等),其排版和绘制都是在主线程进行的,当显示大量文本时,CPU 的压力会非常大。对此解决方案只有一个,那就是自定义文本控件,用 TextKit 或最底层的 CoreText 对文本异步绘制。尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText 对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText 对象占用内存较少,可以缓存下来以备稍后多次渲染。

    图片的解码

    当你用 UIImage 或 CGImageSource 的那几个方法创建图片时,图片数据并不会立刻解码。图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 GPU 前,CGImage 中的数据才会得到解码。这一步是发生在主线程的,并且不可避免。如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到 CGBitmapContext 中,然后从 Bitmap 直接创建图片。目前常见的网络图片库都自带这个功能。

    图像的绘制

    图像的绘制通常是指用那些以 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;
            });
        });
    }
    

    GPU资源消耗原因和解决方案

    相对于 CPU 来说,GPU 能干的事情比较单一:接收提交的纹理(Texture)和顶点描述(三角形),应用变换(transform)、混合并渲染,然后输出到屏幕上。通常你所能看到的内容,主要也就是纹理(图片)和形状(三角模拟的矢量图形)两类。

    纹理的渲染

    所有的 Bitmap,包括图片、文本、栅格化的内容,最终都要由内存提交到显存,绑定为 GPU Texture。不论是提交到显存的过程,还是 GPU 调整和渲染 Texture 的过程,都要消耗不少 GPU 资源。当在较短时间显示大量图片时(比如 TableView 存在非常多的图片并且快速滑动时),CPU 占用率很低,GPU 占用非常高,界面仍然会掉帧。避免这种情况的方法只能是尽量减少在短时间内大量图片的显示,尽可能将多张图片合成为一张进行显示。

    当图片过大,超过 GPU 的最大纹理尺寸时,图片需要先由 CPU 进行预处理,这对 CPU 和 GPU 都会带来额外的资源消耗。目前来说,iPhone 4S 以上机型,纹理尺寸上限都是 4096x4096,更详细的资料可以看这里:iosres.com。所以,尽量不要让图片和视图的大小超过这个值。

    视图的混合 (Composing)

    当多个视图(或者说 CALayer)重叠在一起显示时,GPU 会首先把他们混合到一起。如果视图结构过于复杂,混合的过程也会消耗很多 GPU 资源。为了减轻这种情况的 GPU 消耗,应用应当尽量减少视图数量和层次,并在不透明的视图里标明 opaque 属性以避免无用的 Alpha 通道合成。当然,这也可以用上面的方法,把多个视图预先渲染为一张图片来显示。

    图形的生成

    CALayer 的 border、圆角、阴影、遮罩(mask),CASharpLayer 的矢量图形显示,通常会触发离屏渲染(offscreen rendering),而离屏渲染通常发生在 GPU 中。当一个列表视图中出现大量圆角的 CALayer,并且快速滑动时,可以观察到 GPU 资源已经占满,而 CPU 资源消耗很少。这时界面仍然能正常滑动,但平均帧数会降到很低。为了避免这种情况,可以尝试开启 CALayer.shouldRasterize 属性,但这会把原本离屏渲染的操作转嫁到 CPU 上去。对于只需要圆角的某些场合,也可以用一张已经绘制好的圆角图片覆盖到原本视图上面来模拟相同的视觉效果。最彻底的解决办法,就是把需要显示的图形在后台线程绘制为图片,避免使用圆角、阴影、遮罩等属性。

    展开全文
  • 一、关键帧缓存策略 典型的视频帧序列为IBBPBBPBBP…… 对于直播而言,为了减少直播的延时,通常在编码时不使用B帧。P帧B帧对于I帧都有直接或者间接的依赖关系,所以播放器要解码一个视频帧序列,并进行播放,必须...
  • 原文引用地址:http://blog.51cto.com/dengqi/1223132MAC地址表 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址... 交换机的工作原理 交换机在接收到数据以后,首先、会记录数据...
  • 着色器程序在创建完成后,会放入缓存,下一个循环从缓存中取出使用即可,如果缓存中不存在才会再次生成着色器程序。这也说明可以在程序运行时动态地向着色器程序添加着色器代码。 1、着色器程序写入缓存 osg...
  • MAC地址表 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据的。在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据...
  • 紧跟着类型字段的前四个字段指定了最后四个字段的类型和长度)。 以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据。 ...
  • 我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址。数据链路如以太网或令牌环网都有自己的寻址机制(常常为48bit地址),这是使用数据...当一台主机把以太网数据发送到位于同一局域网上的另一台主机时,是根据4...
  • 传输类就是按照一的固定大小来传输数据,所有的写操作... 传输类同样还是从缓存基类TBufferBase继承而来,实现的接口当然也基本相同,只是实现的方式不同而已,下面就来看看具体的实现过程和原理。  这个类
  • 我们为EasyDarwin实现了客户端快速显示画面/听到同步声音的缓存关键检索方案,具体的实现方法分别在《EasyDarwin手机直播是如何实现的快速显示视频的方法》和《EasyDarwin手机直播转发快速显示问题之音频处理过程...
  • 【3D图像生成算法的原理

    千次阅读 2015-01-07 18:32:58
    2.隐藏面消除 全屏幕Z-Buffer(深度缓存器)算法已成为图形学事实上的标准隐藏面消除算法,他虽然简单但存储要求很高。Z-Buffer算法可看作是工作在...这时新计算的象素的明暗处理值将覆盖帧缓存中的旧值,深度存储器中
  • 网桥工作原理1

    千次阅读 2014-04-09 21:30:28
    缓存:网桥首先会对收到的数据进行缓存并处理 过滤:判断入的目标节点是否位于发送这个的网段中(同一端口中) ,如果是,网桥就不把转发到网桥的其他端口 转发:如果的目标节点位于另一个网络,网桥就将...
  • FFmpeg学习之七(视音频流缓存

    千次阅读 2019-07-31 09:13:33
    原理循环缓存队列实现 缓存队列实现 1.原理 初始化固定数量的结点装入空闲队列,当相机回调产生数据后,从空闲队列头部取出一个结点将产生的每一图像buffer装入,然后入队到工作队列的尾部,处理buffer的线程从...
  • 是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉及的发送与接收、的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功能等。 简介 计算机与外界...
  • 路由器工作原理

    2020-07-28 16:21:51
    3)封装,首先将出接口的MAC地址作为源MAC封装好,然后检查ARP缓存表,检查是否有下一跳的MAC地址,如有,将提取并作为目标MAC地址封装到中,如没有,则发送ARP广播请求下一跳的MAC,并获取到对方的mac地址,再...
  • OSD的原理

    2019-05-21 09:10:01
    显存,也被叫做帧缓存,它的作用是用来存储显卡芯片处理过或者即将提取的渲染数据。如同计算机的内存一样,显存是用来存储要处理的图形信息的部件。我们在显示屏上看到的画面是由一个个的像素点构成的,而每个像素点...
  • osd的原理

    千次阅读 2018-03-05 10:50:52
    显存,也被叫做帧缓存,它的作用是用来存储显卡芯片处理过或者即将提取的渲染数据。如同计算机的内存一样,显存是用来存储要处理的图形信息的部件。我们在显示屏上看到的画面是由一个个的像素点构成的,而每个像素点...
  • 1、交换原理我们知道...这样当一台主机需要向另一台设备发送数据时,在数据中注明目的设备的MAC地址,交换机读取该MAC地址,查询缓存表找到对应的端口号,将直接发往该端口对应的设备即可。缓存表示意如下。端...
  • ARP工作原理

    2020-05-20 22:48:56
    2 如果A的ARP缓存表内存在,直接将数据封装成发送给B 3 如果不存在的话,A缓存数据报文,然后广播ARP请求 4 B收的A的广播请求,然后单播一个ARP响应报文给A 5 A收到B的响应报文后,将B的ip和mac地址缓存在自己的...
  • 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据的。在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据传输到指定的...
  • 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据的。在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据传输到指定的...
  •  说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据的。在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据传输到指定...
  • 显卡工作原理

    千次阅读 2008-04-16 10:11:00
    早期的电脑,CPU和标准的EGA或VGA显示卡以及帧缓存(用于存储图象),可以对大多数图象进行处理,但是它们只是起一种传递作用,我们所看到的就是CPU所提供的。这对老的操作系统象DOS,以及文本文件的显示是足够的,...
  • 1.视频直播的基本原理 视频直播的过程大概由这么几个部分构成: 推流端 源服务器 CDN边缘节点 播放端 直播架构.jpg 整个直播流转的过程是:推流端将视频流推向源服务器,源服务器对视频流进行编码...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 254
精华内容 101
关键字:

帧缓存原理