美文网首页
本地窗口

本地窗口

作者: 小凡帅哥 | 来源:发表于2018-04-27 12:57 被阅读0次

上篇文章我们知道OpenGLES就是把3D数据加工显示到荧屏上,那么它产生的数据就必须经过HAL中的Gralloc模块输出到FrameBuffer上。
那么OpenGLES是如何把数据送给Gralloc的呢
首先假设我们点击手机home,那么可以看到当前荧屏展示的是n个应用界面,底层的是桌面应用(Surface),上边是应用程序首界面(Surface)。那么对于荧屏来说,这一块荧屏显示的不同区块是来自的不同进程,那么就是说在不同进程产生的区域最后汇集到一个平面(FramebufferNativeWindow)上,然后显示到荧屏上。
上边的Surface和FramebufferNativeWindow就分别是应用程序和surfaceFlinger的本地窗口
而surfaceFlinger是系统的显示服务。那么这里其实就明白了,和HAL中的Gralloc打交道就是FramebufferNativeWindow,
那么FramebufferNativeWindow的作用是啥,
FramebufferNativeWindow的作用其实就是加载HAL中的Gralloc,然后open fb(显示屏)和gralloc(缓冲区)设备,然后获取到设备属性。
这样其实就是操作荧屏抽象到自己类中,换句话说忽略到HAL层,FramebufferNativeWindow可以直接操作荧屏
这里还有个知识点就是FramebufferNativeWindow是如何分配buffer的
Android系统默认是双缓冲机制,也就是说最少有俩个缓冲区,(为什么?)
可以这么想我们如何循环利用这俩个缓冲区,当前缓冲区(mBufferHeader),总共缓冲区(mNumBuffers),可用的缓冲区(mFreeBuffer)
加锁
mBufferHeader++
if(mBufferHeader>mNumBuffers)mBufferHeader=0
if(mFreeBuffer<0)等待
被唤醒之后(就是有人释放了缓冲区)
申请到缓冲区mFreeBuffer--

下来说Surface
我们知道应用程序把自己想要绘制的图像放到surface上之后,不可能直接显示到荧屏上,而FramebufferNativeWindow直接操作缓冲区,那么surface就是内存,只有所有应用程序surface,都放在内存里,然后有FramebufferNativeWindow统一汇集到荧屏上,这个就是有SurfaceFlinger完成的
那么申请内存buffer有是如何过程呢
简单说下就是,当应用程序申请(BufferQueue)到一个空闲surface,然后向里面填充数据,然后surface变成了可用的,然后通知surfaceFlinger 找到可用的surface,然后进行一系列操作,然后让surface变成空闲,放回去这样就循环利用了

相关文章

  • 本地窗口

    上篇文章我们知道OpenGLES就是把3D数据加工显示到荧屏上,那么它产生的数据就必须经过HAL中的Gralloc...

  • SourceTree 教程文档(了解界面)

    书签窗口 以下是打开SourceTree时出现的主窗口的示例。本地和远程存储库在该窗口中,您可以选择本地或远程按钮...

  • 第七课 VBA编辑器

    VBA工程窗口、属性窗口(可更改属性,如模块的名称)、代码窗口、立即窗口、本地窗口 工程窗口 :可看到各个对象 属...

  • WindowManagerService本地窗口动画

    一、前言 android的WindowManagerService(简称wms)是系统框架一个非常庞大复杂的一个系...

  • GraphicBuffer管理

    Android本地窗口 Android系统定义了一个Native窗口 ANativeWindow,结构定义如下: ...

  • Python webdriver API(十三)上传文件

    上传过程一般要打开一个系统的window 窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地window ...

  • Skype笔记

    如何在web页面打开本地skype聊天窗口

  • GUI:Android的本地窗口

    1.两种本地窗口 1.面向管理者SurfaceFlinger:FrameBufferNativeWindow2.面...

  • 通过Surface获取ANativeWindow

    每一种操作系统都定义了自己的窗口系统,而 ANativeWindow 就是 Android 的本地窗口,在 And...

  • 本地项目提交到远程仓库

    1.在本地项目目录下打开git命令窗口。 2.在命令窗口依次执行以下命令: git init git add . ...

网友评论

      本文标题:本地窗口

      本文链接:https://www.haomeiwen.com/subject/ffymlftx.html