
Android图形系统
文章平均质量分 91
DJLZPP
不积跬步无以至千里,不积小流无以成江海
展开
-
ImageReader实现原理
1. ImageReader1.1 概述ImageReader允许应用程序直接获取渲染到surface的图形数据,并转换为图片,这里我用Presentation+VirtualDisplay+ImageReader做一个Demo来探讨ImageReader的实现原理。Demo实现的功能是:Presentation指定显示在VirtualDisplay上,然后由ImageReader去获取VirtualDisplay上渲染的Presentation图像,获取之后将其转换为Bitmap,设置到一个Imag原创 2022-04-26 10:29:06 · 8082 阅读 · 3 评论 -
AndroidQ 图形系统(11)UI刷新,SurfaceFlinger,Vsync机制总结
Android4.x版本对UI显示系统进行了重构,引入了三个重要的东西VSYNC、Triple Buffer 和 Choreographer,目的是为UI绘制提供一个稳定的,及时的处理时机。我们知道60HZ的屏幕刷新率是16.6ms一帧,在没有4.x版本之前没有VSYNC时CPU对UI绘制的处理是随机的,也就是View的绘制请求一发出即CPU开始机制UI的处理,那么就有可能出现如下情况:没有VSYNC在绘制第N+1帧时CPU没有及时的处理UI绘制请求,在这个屏幕刷新的后半段CPU才开始,最后导致的情原创 2020-08-14 15:15:33 · 4575 阅读 · 3 评论 -
AndroidQ 图形系统(10)SurfaceView实现原理之surface创建和绘制原理
上一篇文章说了SurfaceView默认Z-order是小于主窗口的,为了能够显示出来,需要以自身所占矩形区域在主窗口设置透明区域,这是在SurfaceView的回调onAttachedToWindow中实现的,本篇接着看SurfaceView另一个回调onWindowVisibilityChanged。首先还是贴出上一篇分析的ViewRootImpl的performTraversals方法部分代码:private void performTraversals() { final View host原创 2020-07-04 14:45:26 · 4745 阅读 · 12 评论 -
AndroidQ 图形系统(9)SurfaceView实现原理之设置透明区域
SurfaceView概述SurfaceView是一种特殊的View,它可以并且应该在子线程进行UI绘制,它具有独立于应用程序之外的surface,主要用来处理复杂,耗时的UI绘制,如视频播放,camera预览,游戏等,SurfaceView的默认Z-order低于应用程序主窗口,为APPLICATION_MEDIA_SUBLAYER = -2,可以通过setZOrderMediaOverlay或者setZOrderOnTop方法进行修改,SurfaceView采用设置透明区域的方式显示出自己,调用的方法原创 2020-07-01 18:05:51 · 3504 阅读 · 0 评论 -
AndroidQ 图形系统(8)SurfaceFlinger合成之Vsync处理
AndroidQ 图形系统(4)queueBuffer函数分析我们知道一块buffer被queue到buffer队列之后就会回调onFrameAvailable函数通知SurfaceFlinger进行消费:if (frameAvailableListener != nullptr) { frameAvailableListener->onFrameAvailable(item); } else if (frameReplacedListener != null原创 2020-06-18 17:35:09 · 2696 阅读 · 1 评论 -
AndroidQ 图形系统(7)GraphicBuffer内存分配与Gralloc
在前面dequeueBuffer函数说了,申请buffer时会首先从mFreeBuffers中取已经绑定了GraphicBuffer且状态为FREE的BufferSlot,如果没有则会从mFreeSlots中取还未绑定GraphicBuffer的BufferSlot,并且会设置BUFFER_NEEDS_REALLOCATION这个flag,之后就会给GraphicBuffer分配内存空间:if (returnFlags & BUFFER_NEEDS_REALLOCATION) {原创 2020-06-16 21:01:09 · 8920 阅读 · 2 评论 -
AndroidQ 图形系统(6)使用纯native API画一个窗口
本篇文章根据前面的分析来实际操作画一个窗口,使用纯native API来实现,这里的native API并非ndk,而是native层函数,需要在AOSP编译环境下进行。首先在/frameworks/native/libs/gui/目录下创建drawWindowTest测试目录,drawWindowTest目录中创建Android.bp和DrawWindowTest.cpp:Android.bp:cc_binary { name: "drawWindow", srcs: ["Draw原创 2020-06-15 13:43:00 · 4959 阅读 · 7 评论 -
AndroidQ 图形系统(5)Fence机制简介
前面分析dequeueBuffer和queueBuffer时,看到Fence都是跳过的,只知道这是一种资源同步机制,具体不了解,这两天在网上查阅了相关资料,对Fence机制有了一个大致的了解,本篇总结一下。什么是同步?java中有个synchronized关键字,被synchronized修饰的方法同一时间只允许一个线程访问,其实Fence机制也有点类似synchronized的,它的主要作用也是限制生产者消费者对同一块buffer的访问,我们想想如果没有Fence机制,那么生产者消费者模型应该这样:生原创 2020-06-12 11:30:17 · 6367 阅读 · 0 评论 -
AndroidQ 图形系统(4)queueBuffer函数分析
上一篇文章分析了dequeueBuffer函数的过程,本篇接着分析queueBuffer函数,当我们需要绘制图像时,调用dequeueBuffer函数获取到可用的GraphicBuffer之后就可以开始绘制了,最常见的绘制操作就是Android上层View的draw方法了,当对GraphicBuffer的绘制操作完成之后就需要调用queueBuffer函数将这块buffer放入BufferQueue队列中并通过回调通知消费者使用这块buffer。...原创 2020-06-10 22:04:14 · 7304 阅读 · 6 评论 -
AndroidQ 图形系统(3)dequeueBuffer函数分析
上一篇文章分析了生产者-消费者模型,构成此模型最重要的三个类就是生产者BufferQueueProducer,消费者BufferQueueConsumer,buffer队列BufferQueue,而buffer队列的核心就是BufferQueueCore。本篇文章来分析一下dequeueBuffer这个函数,这个函数的作用是应用程序一端请求绘制图像时,向BufferQueue中申请一块可用的GraphicBuffer,有了这个buffer就可以绘制图像数据了。在分析这个函数之前先来看看BufferQue原创 2020-06-05 16:22:39 · 9672 阅读 · 4 评论 -
AndroidQ 图形系统(1)Surface与SurfaceControl创建分析
本篇文章分析Surface和SurfaceControl的创建流程,在window通过addView添加到WMS时会创建ViewRootImpl,ViewRootImpl创建好之后Surface,SurfaceControl都作为全局变量被new了出来,但是仅仅是调用了它们无参构造函数创建了一个对象,其他什么也没做,那它们具体初始化在什么地方呢?ViewRootImpl的setView()方法中会调用requestLayout()准备进行View的测量,布局和绘制,即在收到下一个Vsync时执行perfo原创 2020-05-26 19:22:39 · 10713 阅读 · 2 评论 -
AndroidQ 图形系统(2)生产者-消费者模型
上一篇文章分析了上层Window创建之后,native层会创建对应的Surface,以及SurfaceFlinger进程会创建对应Layer,所以应用层的窗口对应到SurfaceFlinger进程其实就是Layer。AndroidQ上SurfaceFlinger能够创建四种类型的Layer,BufferQueueLayer,BufferStateLayer,ColorLayer,ContainerLayer,最常用的就是BufferQueueLayer在创建BufferQueueLayer同时会创建一套原创 2020-06-03 12:15:01 · 5390 阅读 · 0 评论