Android GUI系统之SurfaceFlinger(01)显示系统框架
该系列文章总纲链接: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)主要可以做以下几件事情:
- 给app提供buffer: 通过gralloc模块向ashmen申请内存得到文件句柄fd,将fd通过binder机制传递给对应的app,app再执行mmap操作即可获得 对应的buffer。
- 将app发来的buffer(界面数据)进行合成:根据各个界面的layer(就是Z值,由WindowManagerService来确定),把这些排序后的整体buffer传递给HardwareComposer(后简称HWC)。
- 当HWC不能处理(无HWC硬件、超出HWC层数)buffer时,使用图形库GL来处理。
- 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)显示系统框架相关推荐
- Android GUI 系列之Surfaceflinger
Android GUI 系列之Surfaceflinger 文章目录 Android GUI 系列之Surfaceflinger 前言 1. Surfaceflinger是什么? 2. Surface ...
- android surfaceflinger研究----显示系统
这周抽空研究了一下SurfaceFlinger,发现真正复杂的并不是SurfaceFlinger本身,而是Android的display显示系统,网上关于这部分的介绍有不少,本不打算写的,但是发现还是 ...
- 2022-2028年全球及中国汽车显示系统行业投资前景分析
本文研究全球与中国市场汽车显示系统的发展现状及未来发展趋势,分别从生产和消费的角度分析汽车显示系统的主要生产地区.主要消费地区以及主要的生产商.重点分析全球与中国市场的主要厂商产品特点.产品规格.不同 ...
- GUI显示系统之SurfaceFlinger
第1章 GUI系统之SurfaceFlinger 在进入GUI系统的学习前,建议大家可以先阅读本书应用篇中的"OpenGLES"章节,并参阅OpenGL ES官方指南.因为And ...
- GUI显示系统之 SurfaceFlinger
转载自http://blog.csdn.net/uiop78uiop78/article/details/8954508 介绍了Surface, SurfaceTexture, BufferQueue ...
- ]GUI显示系统之SurfaceFlinger
转载自http://blog.csdn.net/uiop78uiop78/article/details/8954508 介绍了Surface, SurfaceTexture, BufferQueue ...
- android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论
GUI 是任何系统都很重要的一块. android GUI大体分为4大块. 1)SurfaceFlinger 2)WMS 3)View机制 4)InputMethod 这块内容非常之多,但是理解后,可 ...
- Android图形合成和显示系统---基于高通MSM8k MDP4平台
介绍了Android SurfaceFlinger层次以下的图形合成和显示系统,主要基于高通MSM8k MDP4x平台. 做为Android Display专题.SurfaceFlinger的详细介绍 ...
- 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)
Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...
最新文章
- 二维vector的声明和初始化
- 在数据库什么是主键与外键
- Java网络编程2---Socket-TCP编程
- win10打印机终结点映射器_用了就回不去?微软官方免费“外挂”,让win10好用到飞起...
- Redis读写分离技术解析
- 辽宁计算机专业院校排名2015,liaoning高校排行榜_辽宁高校排名 2015年辽宁省最佳大学排行榜...
- 在windows、linux中开启nginx的Gzip压缩大大提高页面、图片加载速度转
- MyBatis映射文件4(参数获取#{}和${}/select标签详解[返回类型为list])
- 浙江大学计算机学院足球队,校三好杯 | 海洋学院足球队:再创佳绩
- 10大习惯让你变年轻
- Ionic3城市检索和滑动定位
- 【学习笔记】爬虫框架Scrapy入门
- 基与坐标系(阅读《理解矩阵》笔记)
- CUDA学习资源整合
- 培育百万开发者,Serverless的主战场
- 【BAT-表姐御用01dir命令】批量获取文件夹中的文件名
- 求 有关数字功放的设计报告 见详情
- android app crash测试,APP常见崩溃原因和测试方法整理
- java笔记(含gui)
- 程序员发展职业规划_梁胜博士:写给程序员的话