该系列文章总纲链接:Android GUI系统之SurfaceFlinger 系列文章目录


本章关键点总结 & 说明:

本章节思维导图如上。主要讲述了显示系统的基础,了解FrameBuffer与Android的关系,给出SurfaceFlinger的整体框架以及一个核心的demo测试程序。接下来的章节 将以该demo为核心进行阐述和分析。


1 frameBuffer与Android

当我们的程序 想要 在屏幕上显示内容时,我们的机制是直接向FrameBuffer(后面简称FB)写入内容来实现。接下来谈谈Android 实用FB的策略:

如果只有一个FB,当APP写入速度>LCD显示速度时没问题;当APP写入速度 <=LCD显示速度时,会卡顿和闪烁,为了解决这个问题,一般采用2个以上FB。以2个FB为例,APP写入FB0,LCD此时渲染FB1,FB0写入结束后,LCD渲染FB0,此时APP写入FB1,之后不断循环即可。

对于Android系统来说,有很多个APP,如果这些APP同时向FB写入内容那显示的内容就乱了,因此 需要一个大管家来管理,这个大管家就是 SurfaceFlinger。

2 SurfaceFlinger整体框架简图说明(因为是简图,主要为了方便学习和理解,所以并不完善)

SurfaceFlinger(后 简称SF)主要可以做以下几件事情:

  1. 给app提供buffer: 通过gralloc模块向ashmen申请内存得到文件句柄fd,将fd通过binder机制传递给对应的app,app再执行mmap操作即可获得 对应的buffer。
  2. 将app发来的buffer(界面数据)进行合成:根据各个界面的layer(就是Z值,由WindowManagerService来确定),把这些排序后的整体buffer传递给HardwareComposer(后简称HWC)。
  3. 当HWC不能处理(无HWC硬件、超出HWC层数)buffer时,使用图形库GL来处理。
  4. SF也好,APP也好,都可以直接调用EGL层接口来实现 渲染功能。

3 最简单的 Surface测试程序

为了更好的了解SurfaceFlinger的显示流程我们先用最简单的例子感知下最小显示系统。同时 后面的章节也会以此来分析 SF的内部机制。程序代码如下:

#include <cutils/memory.h>
#include <utils/Log.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <android/native_window.h>using namespace android;int main(int argc, char** argv)
{// 启动binder 和 它的线程池sp<ProcessState> proc(ProcessState::self());ProcessState::self()->startThreadPool();// 创建surfaceflinger的客户端sp<SurfaceComposerClient> client = new SurfaceComposerClient();//获取surfacesp<SurfaceControl> surfaceControl = client->createSurface(String8("resize"),160, 240, PIXEL_FORMAT_RGB_565, 0);sp<Surface> surface = surfaceControl->getSurface();//设置layer,layer值越大,显示层越靠前SurfaceComposerClient::openGlobalTransaction();surfaceControl->setLayer(100000);SurfaceComposerClient::closeGlobalTransaction();//获取buffer->锁定buffer->写入buffer->解锁并提交bufferANativeWindow_Buffer outBuffer;surface->lock(&outBuffer, NULL);ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);android_memset16((uint16_t*)outBuffer.bits, 0xF800, bpr*outBuffer.height);surface->unlockAndPost();sleep(3);//同上surface->lock(&outBuffer, NULL);android_memset16((uint16_t*)outBuffer.bits, 0x07E0, bpr*outBuffer.height);surface->unlockAndPost();sleep(3);IPCThreadState::self()->joinThreadPool();return 0;
}

对应的Android.mk文件如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)LOCAL_SRC_FILES:= \SurfaceTest.cppLOCAL_SHARED_LIBRARIES := \libcutils \libutils \libui \libgui \libbinderLOCAL_MODULE:= SurfaceTestLOCAL_MODULE_TAGS := testsinclude $(BUILD_EXECUTABLE)

程序的显示效果如下(即在界面上显示一个色块 ):

整个流程总结如下:

获取SurfaceFlinger->获取Surface->设置Layer->获取Buffer->锁定buffer->写入buffer->解锁并提交buffer

Android GUI系统之SurfaceFlinger(01)显示系统框架相关推荐

  1. Android GUI 系列之Surfaceflinger

    Android GUI 系列之Surfaceflinger 文章目录 Android GUI 系列之Surfaceflinger 前言 1. Surfaceflinger是什么? 2. Surface ...

  2. android surfaceflinger研究----显示系统

    这周抽空研究了一下SurfaceFlinger,发现真正复杂的并不是SurfaceFlinger本身,而是Android的display显示系统,网上关于这部分的介绍有不少,本不打算写的,但是发现还是 ...

  3. 2022-2028年全球及中国汽车显示系统行业投资前景分析

    本文研究全球与中国市场汽车显示系统的发展现状及未来发展趋势,分别从生产和消费的角度分析汽车显示系统的主要生产地区.主要消费地区以及主要的生产商.重点分析全球与中国市场的主要厂商产品特点.产品规格.不同 ...

  4. GUI显示系统之SurfaceFlinger

    第1章  GUI系统之SurfaceFlinger 在进入GUI系统的学习前,建议大家可以先阅读本书应用篇中的"OpenGLES"章节,并参阅OpenGL ES官方指南.因为And ...

  5. GUI显示系统之 SurfaceFlinger

    转载自http://blog.csdn.net/uiop78uiop78/article/details/8954508 介绍了Surface, SurfaceTexture, BufferQueue ...

  6. ]GUI显示系统之SurfaceFlinger

    转载自http://blog.csdn.net/uiop78uiop78/article/details/8954508 介绍了Surface, SurfaceTexture, BufferQueue ...

  7. android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论

    GUI 是任何系统都很重要的一块. android GUI大体分为4大块. 1)SurfaceFlinger 2)WMS 3)View机制 4)InputMethod 这块内容非常之多,但是理解后,可 ...

  8. Android图形合成和显示系统---基于高通MSM8k MDP4平台

    介绍了Android SurfaceFlinger层次以下的图形合成和显示系统,主要基于高通MSM8k MDP4x平台. 做为Android Display专题.SurfaceFlinger的详细介绍 ...

  9. 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)

    Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...

最新文章

  1. 二维vector的声明和初始化
  2. 在数据库什么是主键与外键
  3. Java网络编程2---Socket-TCP编程
  4. win10打印机终结点映射器_用了就回不去?微软官方免费“外挂”,让win10好用到飞起...
  5. Redis读写分离技术解析
  6. 辽宁计算机专业院校排名2015,liaoning高校排行榜_辽宁高校排名 2015年辽宁省最佳大学排行榜...
  7. 在windows、linux中开启nginx的Gzip压缩大大提高页面、图片加载速度转
  8. MyBatis映射文件4(参数获取#{}和${}/select标签详解[返回类型为list])
  9. 浙江大学计算机学院足球队,校三好杯 | 海洋学院足球队:再创佳绩
  10. 10大习惯让你变年轻
  11. Ionic3城市检索和滑动定位
  12. 【学习笔记】爬虫框架Scrapy入门
  13. 基与坐标系(阅读《理解矩阵》笔记)
  14. CUDA学习资源整合
  15. 培育百万开发者,Serverless的主战场
  16. 【BAT-表姐御用01dir命令】批量获取文件夹中的文件名
  17. 求 有关数字功放的设计报告 见详情
  18. android app crash测试,APP常见崩溃原因和测试方法整理
  19. java笔记(含gui)
  20. 程序员发展职业规划_梁胜博士:写给程序员的话

热门文章

  1. 比例电磁阀(一)介绍和流量特性
  2. Golang 开发的一站式云原生 PaaS 平台 —— Erda
  3. 计算机毕业设计SSM爱宝贝影楼管理系统【附源码数据库】
  4. 佳能Canon imageRUNNER ADVANCE DX C3725 一体机驱动
  5. Android 判断点是否在Path中(含不规则形状的Path)
  6. 在 Ubuntu18.04 中为fctix小企鹅增加五笔输入法
  7. Uniapp 原生插件 云打包
  8. 25.(C语言)回文数判断万用公式
  9. UI架构设计五 — DTA文件使用脚本自动生成
  10. 终于有人把5G+人工智能讲明白了