做网站给韩国卖高仿wordpress模版 使用教程
- 作者: 五速梦信息网
- 时间: 2026年04月18日 09:56
当前位置: 首页 > news >正文
做网站给韩国卖高仿,wordpress模版 使用教程,免费双语网站模板,毕设 网站开发的必要性Android GPU渲染屏幕绘制显示基础概念#xff08;1#xff09; Android中的图像生产者OpenGL#xff0c;Skia#xff0c;Vulkan将绘制的数据存放在图像缓冲区中#xff0c;Android中的图像消费SurfaceFlinger从图像缓冲区将数据取出#xff0c;进行加工及合成。 Surface…Android GPU渲染屏幕绘制显示基础概念1 Android中的图像生产者OpenGLSkiaVulkan将绘制的数据存放在图像缓冲区中Android中的图像消费SurfaceFlinger从图像缓冲区将数据取出进行加工及合成。 SurfaceFlinger是Android最重要的图像消费者Activity绘制的界面都会传递到SurfaceFlingerSurfaceFlinger的作用是接收图像缓冲区数据然后交给HWComposer或者OpenGL做合成。 SurfaceFlinger是如何接收图像缓冲区的数据呢先了解Layer层概念一个Layer包含一个Surface一个Surface对应一块图形缓冲区而一个界面是由多个Surface组成的所以它们会一一对应到SurfaceFlinger的Layer中。SurfaceFlinger通过读取Layer的缓冲数据就相当于读取界面上Surface的图像数据。 图像数据→CPU→显卡驱动→显卡GPU→显存帧缓冲→显示器 App绘制及SF的合成分别由对应的软件VSYNC驱动VSYNC-app驱动App绘制VSYNC-sf驱动SF进行合成。 VSYNC-app与VSYNC-sf按需发射如果App要更新界面它申请VSYNC-app如果没有App申请VSYNC-app那么VSYNC-app不发射。同样当App更新界面它会把对应的Graphic Buffer放到Buffer Queue中。Buffer Queue通知SF进行合成此时SF申请VSYNC-sf。如果SF不申请VSYNC-sfVSYNC-sf将不再发射。如果App持续不断的更新它就得不断申请VSYNC-app而对SF来说只要有合成任务它就得再去申请VSYNC-sf。Choreographer 可以接收系统的 VSYNC 信号统一管理应用的输入、动画和绘制等任务的执行时机。 VSYNC-app与VSYNC-sf相互独立。VSYNC-app触发App绘制Vsync-sf触发SF合成。App绘制与SF合成都会加大CPU负载为避免绘制与合成造成性能问题VSYNC-app可与VSYNC-sf稍微错开。 Vsync offset机制 Vsync-app、Vsync-sf并不是同时通知的Vsync-sf相对晚些但对于App来说可认为大约同时发生。 硬件VSYNC同步信号发送周期是固定的既然都相互独立在自己进程里等待VSync信号到来然后各司其职做自己的工作那通过更改偏移量的方式把“APP进程”和“sf进程”接收到VSync信号的时间错开就可以实现在一个硬件VSync信号周期内完成“渲染”和“合成”两件事具体方案如下 VSyncPhaseOffsetNs 0硬件VSync发生后直接转发给app进程让它开始绘制 sfVSyncPhaseOffsetNs ≥1硬件VSync发生后延迟几毫秒再转发给sf进程因为app已经渲染完成sf合成刚刚渲染的图层 好了在一个硬件VSync周期如熟知的16ms内“渲染”和“合成”的工作都已经完成了并且由于GPU性能过于快速距离下次硬件VSync信号发送甚至还有14ms…等下一次硬件VSync信号到来时显示框架完成画面切换和之前的方案比同样是60HZ的屏幕用户从按下按钮到看到画面更新只需要等待1个VSync信号周期也就是约16ms。 SF合成的是App的上一帧而App当前正在绘制的那一帧要等到下一个VSYNC-sf来临再进行合成。Choreographer用于实现CPU/GPU的绘制是在VSYNC到来时开始。 GPUGraphics Processin Unit图形处理器是一种专门用于图像运算的处理器在计算机系统中通常被称为 显卡的核心部件就是 GPU。 UI 组件在绘制到屏幕之前都需要经过 Rasterization栅格化操作而栅格化又是一个非常耗时的操作。Rasterization 栅格化是绘制那些 Button、Shape、Path、String、Bitmap 等显示组件最基础的操作。栅格化将这些 UI 组件拆分到显示器的不同像素上进行显示。这是一个非常耗时的操作GPU 的引入就是为了加快栅格化。 Android APP而言GPU硬件加速绘制可以分为 第一阶段APP在UI线程构建渲染的命令及数据. 第二阶段CPU将数据上传共享或者拷贝给GPUPC一般有显存但ARM嵌入式设备内存一般是GPU-CPU共享内存. 第三阶段通知GPU渲染CPU一般不会阻塞等待GPU渲染结束效率低CPU通知结束后就返回继续执行其他任务Fence辅助GPU CPU同步. 第四阶段swapBuffers通知SurfaceFlinger图层合成. 第五阶段SurfaceFlinger合成图层如果之前提交的GPU渲染任务没结束则等待GPU渲染完成再合成Fence机制合成依然是依赖GPU不过这作为下一个任务. 第一阶段主要是CPU工作这个阶段前期运行在UI线程后期部分运行在RenderThread渲染线程第二个阶段主要运行在渲染线程CPU将数据同步共享给GPU之后GPU进行渲染CPU一般不会阻塞等待GPU渲染完毕而是通知结束后就返回。CPU返回后会直接将GraphicBuffer提交给SurfaceFlinger告诉SurfaceFlinger进行合成但是这个时候GPU可能并未完成之前的图像渲染这时候就牵扯到一个同步Android中用的是Fence机制SurfaceFlinger合成前会查询Fence如果GPU渲染没有结束则等待GPU渲染结束GPU结束后会通知SurfaceFlinger进行合成SF合成后提交显示最终完成图像的渲染显示。 GraphicBuffer是整个图形系统的核心渲染操作都将在此对象上进行包括同步给GPU和HWC每当应用有显示需求时应用会向系统申请一块GraphicBuffer内存这块内存将会共享给GPU用于渲染工作接着会同步给HWC用于合成和显示可以把每一个GraphicBuffer对象看做是一个个渲染完成的图层。 在Android里GraphicBuffer的同步主要借助Fence同步机制最大特点是能处理GPU、CPU、HWC的同步。GPU处理一般是异步的CPU命令并不是即刻被GPU执行的而是被缓存在缓冲区中而CPU可能不知道执行时机除非CPU阻塞等待但毫无疑问会使CPU、GPU并行处理效率降低至少渲染线程是被阻塞所以CPU提交命令后就返回不等待GPU处理。SurfaceFlinger图形合成SurfaceFlinger需要知道什么时候GraphicBuffer被GPU处理填充完毕这个时候就是Fence机制发挥作用的地方。 一个GraphicBuffer对象的生命周期 渲染阶段应用有绘图需求了系统分配一块内存给应用应用调用GPU执行绘图此时使用者是GPU。 合成阶段GPU渲染完成后将图层传递给sf进程sf进程决定由谁来合成hwc或者GPU如果使用GPU合成那么此时GraphicBuffer的使用者依旧是GPU如果使用hwc合成那么此时GraphicBuffer的使用者是hwc。 显示阶段所有的GraphicBuffer在此阶段使用者都是hwc因为hwc控制着显示芯片。 从生命周期可以看出GraphicBuffer对象在流转的过程中会被GPU、CPU、DPU三个不同的硬件访问。如果同一块内存能够被多个硬件设备访问就需要一个同步机制Android图形系统中Fence机制就是用来不同模块访问时的数据安全Fence的逻辑实现可参考Java的synchronized互斥锁可把Fence理解为一把硬件的互斥锁每个需要访问GraphicBuffer的角色在使用前都要检查这把锁是否unlock了才能进行操作否则就要等待(waitForever)。 BufferQueue 它是一个封装了GraphicBuffer的队列BufferQueue对外提供了GraphicBuffer对象出列/入列的接口。BufferQueue生产者/消费者模式大多数情况APP作为GraphicBuffer的生产者sf进程作为GraphicBuffer的消费者共同操作一个buffer队列。 生产者APP进程 1、producer-dequeueBuffer() 从队列取出一个状态为“FREE”的buffer此时该buffer状态变化为FREE-DEQUEUED 2、producer-queueBuffer() 将渲染完成的buffer入列此时该buffer状态变化为DEQUEUED-QUEUED 消费者sf进程 1、consumer-acquireBuffer() 从队列中取出一个状态为“QUEUED”的渲染完的buffer准备去合成送显此时该buffer的状态变化为QUEUED-ACQUIRED 2、consumer-releaseBuffer() buffer内容已经显示过了可以重新入列给APP使用了此时该buffer的状态变化为ACQUIRED-FREE 每个Buffer的一生就是在不断地循环FREE-DEQUEUED-QUEUED-ACQUIRED-FREE这个过程这中间有任何一个环节出现延迟反应到屏幕上就是应用出现了卡顿。 无论App使用哪种API进行图形开发绘制在绘制流程结束后APP作为图层的生产者总是会调用BufferQueue的queueBuffer()方法将GraphicBuffer入列一旦有新的图层加入队列就意味着作为图层消费者的SF进程可以开始工作了。 当APP端的Surface发生变化以后Layer的onFrameAvailable()方法会被调用经过层层转发最终由MessageQueue#requestNextVSync()执行VSync信号的请求。 APP进程中的每一个Surface对象对应SF进程当中的一个Layer对象它俩共享一个BufferQueue Surface作为图层的生产者封装了出列入列的操作 Layer作为图层的消费者封装了获取渲染图层和释放图层的操作。 一个APP完整的显示流程大致分为三个阶段app-请求 APP页面元素一旦发生变化调用invalidate()/requestLayout()方法请求下一次VSync信号此时sf什么都不做。app-VSync sf-请求 app-VSync信号到来后APP进程执行绘图三部曲绘图流程结束后sf收到onFrameAvailable()sf进程请求VSync。sf-VSync sf-VSync信号到来sf进程执行合成接着将结果提交给hwc等待下次硬件VSync信号发生切换Framebuffer展示给用户。 Android性能Double Buffer双缓冲/Triple Buffer三缓冲丢帧Jank与无丢帧No Jank-CSDN博客文章浏览阅读850次点赞6次收藏13次。Android ADB调试真机设备Android ADBAndorid Debug Bridge是Android开发中有用的测试和调试工具。使用Android ADB调试设备直接在Windows的dos命令窗口输入命名adb即可如图为什么执行adb命令后是这样_android 抓trace。三Buffer轮转情况下基本不会有这种情况的发生渲染线程一般在 dequeueBuffer 时都可以顺利拿到可用的 Buffer 如果 dequeueBuffer 本身耗时那就也会拉长时间。https://blog.csdn.net/zhangphil/article/details/138213964
- 上一篇: 做网站阜新网站价值 批量查询
- 下一篇: 做网站工资多钱网站建设推广唯心cidun8
相关文章
-
做网站阜新网站价值 批量查询
做网站阜新网站价值 批量查询
- 技术栈
- 2026年04月18日
-
做网站付费流程手机在线画图工具
做网站付费流程手机在线画图工具
- 技术栈
- 2026年04月18日
-
做网站付多少定金开发公司经营范围
做网站付多少定金开发公司经营范围
- 技术栈
- 2026年04月18日
-
做网站工资多钱网站建设推广唯心cidun8
做网站工资多钱网站建设推广唯心cidun8
- 技术栈
- 2026年04月18日
-
做网站工资高么淘宝在线购物网站
做网站工资高么淘宝在线购物网站
- 技术栈
- 2026年04月18日
-
做网站工作html5绿色的房地产手机网站模板源码
做网站工作html5绿色的房地产手机网站模板源码
- 技术栈
- 2026年04月18日

