首页 > 其他分享 >页面绘制的来龙去脉

页面绘制的来龙去脉

时间:2024-08-10 11:57:25浏览次数:12  
标签:来龙去脉 数据 缓冲 缓冲区 GPU Android 绘制 页面

一、概述

1.Android 中,用户编写的应用程序(Client)测量和计算布局,SurfaceFlinger(Server)用来渲染绘制界面,Client和Server通过匿名共享内存(Anonymous Shared Memory)通信。

2.每个应用和 SurfaceFlinger 之间都会创建一个SharedClient,一个 SharedClient 最多可以创建31 个 SharedBufferStack,每个 Surface 对应一个 SharedBufferStack,也就是一个 Window。即每个应用最多可以创建 31 个窗口。


二、原理

1.Android 4.1 之后,Android OS 团队对 Android Display 进行了进化和改变,引入了三个核心元素:Vsync,Triple Butter,Choreographer。

2.图形界面的绘制,是由 CPU 准备数据,然后通过驱动层把数据交给 GPU 进行绘制。图形 API 不允许 CPU 和 GPU直接通信,所以就有了图形驱动(Graphics Driver)来进行通信。图形驱动 维护了一个序列(Display List),CPU 不断把需要显示的数据放进去,GPU 不断地将数据取出来进行显示。其中 Choreographer 起调度的作用,统一绘制图像到 Vsync 的某个时间点。
Choreographer在收到Vsync信号时,调用用户设置的回调函数。函数的先后顺序如下:
1)CALLBACK_INPUT:与输入事件有关
2)CALLBACK_ANIMATION:与动画有关
3)CALLBACK_TRAVERSAL:与 UI 绘制有关

3.Android中开发者可以通过SurfaceHolder来访问和操作缓冲区,在绘制每一帧之前调用lockCanvas()来获取缓冲区,并在绘制完成后调用unlockCanvasAndPost()来提交更改。


三、多重缓冲

1.概述

1)多重缓冲允许程序在后台缓冲区准备数据,在前台缓冲区显示页面,从而避免了在更新数据时造成的屏幕闪烁或卡顿。
2)OpenGL ES、Android Canvas绘制和视频播放时为避免等待数据时的卡顿,也会使用多重缓冲。

2.双重缓冲

在 Linux 上,通常使用 FrameBuffer 来做显示输出。
双重缓冲会创建一个 FrontBuffer 和一个 BackBuffer,FrontBuffer 是当前显示的页面,BackBuffer是下一个要显示的画面。然后前后缓存依次交替显示数据。
这样的特点为:
1)如果是单重缓冲,页面可能会有这种情况:A 数据需要显示,然后是 B 数据显示,B 数据显示需要耗费一定时间,但是这个时间里,C 数据也请求了展示,我们可能会看到,在展示 C 数据的时候,还有 B 数据的残影。而双重缓冲会更好得避免这个问题。
2)双重缓冲仍然可能会卡。
3)CPU 和 GPU 的刷新时间,和Display的FPS是一致的。因为只有到发出 Vsync 命令的时候,CPU 和GPU才会进行刷新或显示的动作。

3.三重缓冲

1)在渲染过程中,一个缓冲区用于显示,一个用于渲染,一个用于备用。当渲染完成时,备用缓冲区变为渲染缓冲区,渲染缓冲区变为显示缓冲区,原来的显示缓冲区变为备用缓冲区。
2)除了 A 和 B 两个图层在交替显示,还有一个第三者 C 图层在不断帮A和B可能需要展示的数据进行缓冲。实际中只有在需要时,才会进行三重缓冲。正常情况下,只使用二重缓冲。
2)缓冲区不是越多越好。


4.当GPU的帧率高于显示器的刷新率时,可能出现一个刷新周期内GPU生成多帧数据的情况,从而造成画面撕裂。为解决这一问题,使用多重缓冲来同步GPU帧率和显示器刷新率。
 


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

标签:来龙去脉,数据,缓冲,缓冲区,GPU,Android,绘制,页面
From: https://blog.csdn.net/cxsjabcabc/article/details/141087663

相关文章

  • cordova配置启动页面
     目前基本上文章使用的都是  splash 这个标签,但是这个东西已经不支持了 直接就是让我们换标签去使用官网:Cordova解决文章:疑似开发人员Cordova11-SplashScreen-whatgoesinsplashscreen.xml-StackOverflow  splash替换成 <preferencename="And......
  • Javascript(turfjs)等值线图绘制
    Javascript(turfjs)等值线图绘制舍瓦温 2020-04-07阅读 5 分钟14 使用气象、环境类空间数据绘制等值线通常是由NCL、Python来做,在一些场景中:你只是想在WEB端做一些简单的绘制你的后端只有Node.js环境你纯粹是个前端工程师你也许需要......
  • Django5+Vue3:OA系统前后端分离项目实战-Frame页面框架搭建(14)
    Django5+Vue3系列文章前言本节开始,全文仅对会员开放。若点赞和收藏数量超过100,全文将免费开放。此项目采用Django框架的5.0.7版本进行开发。Django5.0支持的Python版本为3.10、3.11和3.12。OA系统系列文章将持续更新,直至项目的Docker部署阶段。专栏链接:......
  • vue-页面高亮展示code代码组件
     在main.js里引用组件importhljsfrom"highlight.js";import"highlight.js/styles/atom-one-dark.css";Vue.directive("highlight",function(el){letblocks=el.querySelectorAll("precode");blocks.forEach((block)......
  • 页面水印定义和使用
    水印使用:1、引入定义的watermark.js文件letwatermark=newWatermark({contend:"水印内容",fontSize:16,……});2、离开页面要主动销毁watermark&&watermark.removeWatermark(); 水印定义,定义watermark.js文件,内容如下exportdefaultclassW......
  • HTML静态网页作业(HTML+CSS)——外卖平台主题网页设计制作(8个页面)
    ......
  • div-固定在页面中间,不被其他元素覆盖
    最开始设置的子元素D是text-align:center,子元素C的内容过长的时候,会发现子元素D不在页面正中了所以需要把子元素D设置成固定中间,把子元素D设置成固定中间后,发现元素B把子元素D给覆盖了一部分,所以需要在父元素A和元素B之间加一个空的div,给div设置高度后,父元素A和元素B之间的距离......
  • 用echarts绘制图表时,横坐标数据太多显示不全/堆叠的解决方法
    一、横坐标数据过多可能出现的问题1、横坐标文字堆叠2、横坐标显示不全(数据2,数据4,数据6,数据8,数据10,数据12,数据14均没有显示出来)二、解决方法1、使用rotate属性给echarts的横坐标标签设置旋转角度xAxis:{type:'category',data:xAxis,......
  • fiftyone localhost:5151页面打开空白 error: disallowed MIME type (“text/plain”)
    解决办法:您必须更改两个键的注册表设置。打开注册表编辑器并前往Computer\HKEY_CLASSES_ROOT\.js并更改ContentType为application/javascript前往Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.js并更改 ContentType为application/javascript。然后只需重新启动shell......
  • 使用python做页面,测试数据库连通性!免费分享!测试通过~
    免费分享刚刚写的一个小程序,测试通过没问题,解BUG也就花了半小时吧有更好的方法欢迎评论区推给我谢谢。importtkinterastkfromtkinterimportmessageboximportpymysqldefget_db_info(db_source):ifdb_source=='database1':hostname=e1.get()......