Android 图形系统SurfaceFlinger

深入Android系统(十二)Android图形显示系统-1-显示原理与Surface Window Positioning中的WindowManager主要是用来控制Window对象 Window对象是用来存放View对象的容器,每个Window对象都会关联Surface对象 WindowManager监视Window对象的生命周期、输入和焦点事件、屏幕方向、转换、动画、位置、变换、z顺序等 然后将所有Window元数据发送给SurfaceFlinger,SurfaceFlinger利用这些元数据把自己管理的所有Surface组合成layer 然后交给Hardware C.. 阅读详情

http://hi.baidu.com/kikicat0_0/blog/item/0c8ff92c5ecaa23d359bf7a6.html


本文试图讲述Android图形系统的底层实现。Android图形系统底层实现非常复杂,文档较少,没有使用比较流行的图形组建如X window, Cairo等。

Android中的图形系统采用Client/Server架构。Server (即SurfaceFlinger)主要由c++代码编写而成。Client端代码分为两部分,一部分是由Java提供的供应用使用的api,另一部分则是由c++写成的底层实现。下图概要介绍了android图形系统的架构以及使用到的主要组件。

Android图形系统中一个重要的概念和线索是surface。View及其子类(如TextView, Button)要画在surface上。每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。每个canvas对象对应一个bitmap,存储画在surface上的内容。

每个Surface通常对应两个buffer,一个front buffer, 一个back buffer。其中,back buffer就是canvas绘图时对应的bitmap (研究android_view_Surface.cpp::lockCanvas)。因此,绘画总是在back buffer上,需要更新时,则将back buffer和front buffer互换。

The window is tied to a Surface and the ViewRoot asks the Surface for a
Canvas that is then used by the Views to draw onto. After View draw its data to canvas, ViewRoot
will call surface.unlockCanvasAndPost(canvas) to schedule surfaceFlinger::composeSurfaces() which do the actually display to display panel. SurfaceFlinger handles to transfers drawn data in canvas to surface front buffer or backbuffer

Except for SurfaceViews, different views within the same ViewRoot share the same surface.

Layer的概念:

每个surface又对应一个layer, SurfaceFlinger负责将各个layer的front buffer合成(composite)绘制到屏幕上。
A Layer is something that can be composited by SurfaceFlinger (should have been called LayerFlinger). There are several types of Layers if you look in the code, in particular the regular ones (Layer.cpp) , they are backed by a Surface, and the LayerBuffer (very badly chosen name) which don't have a backing store, but receive one from their client. . Note that the GGLSurface type, should have been called GGLBuffer
 
Multiple layers are just composited to the final buffer in  their Z order.


有几个对象与Surface概念紧密相关:
1. Java Surface (frameworks/base/core/java/android/view/Surface.java)。该对象被应用间接调用(通过SurfaceView, ViewRoot等), 应用需要创建surface,(并同时创建canvas), 将图形绘制到这个对象上并最终投递到屏幕上。
2. C++ Surface (frameworks/base/libs/ui/Surface.cpp。 这个对象被Java Surface通过Jni 调用,实现Java Surface 的功能
3. ISurface (以及其派生类BnSurface)。这个对象是应用和server之间的接口。C++ Surface创建这个ISurface (BnSurface)并发送命令,如更新surface内容到屏幕上。Server端接受这个命令并执行相应操作。

研究一个surface如何创建的关键路径如下:
1. frameworks/base/core/java/android/view/Surface.java -- Surface::Surface ()
2. frameworks/base/core/jni/android_view_Surface.cpp -- Surface_init ()。在这个函数中SurfaceComposerClient 对象被创建。
3. frameworks/base/libs/ui/SurfaceComposerClient.cpp -- SurfaceComposerClient::SurfaceComposerClient (). 这个函数非常重要,在这里建立了client和server之间的桥梁。通过函数_get_surface_manager()获得了一个指向server的IBinder 对象(具有ISurfaceComposer接口),之后通过这个IBinder就可以跨进程访问Server的功能。接着调用ISurfaceComposer::createConnection()创建并返回了一个ISurfaceFlingerClient的IBinder。
4. frameworks/base/libs/ui/SurfaceComposerClient.cpp -- SurfaceComposerClient::createSurface().这个函数中,利用前面获得的ISurfaceFlingerClient的IBinder,调用其createSurface接口。
5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -- BClient::createSurface ()。BClient由ISurfaceFlingerClient派生而来。
6. frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -- SurfaceFlinger:: createSurface()。这个函数为Surface创建一个对应的Layer。

上述关键路径中,1,2,3,4运行于client进程中,而5,6运行与server进程中。server作为一个service提供给client访问。

与图形相关的代码主要位于下列目录:
1、frameworks/base/graphics/java/android/graphics
2、frameworks/base/core/java/android/view
3、frameworks/base/core/java/android/widget
4、frameworks/base/opengl/
5、frameworks/base/libs/ui
6、frameworks/base/libs/surfaceflinger
7、frameworks/base/core/jni/android/graphics
8、frameworks/base/core/jni/android/opengl
9、frameworks/base/core/jni/android/android_view_*.cpp
10、external/skia


一、下列目录中的部分代码:
1、frameworks/base/graphics/java/android/graphics
2、frameworks/base/core/java/android/view
3、frameworks/base/core/java/android/widget

android.graphics, android.view和android.widget功能和其他类似的图形库如Qt/Gtk+差不多,分别提供基本的图形原语(如画点画线,设置图形上下文等),事件机制,以及开发图形用户界面的控件等。canvas 用于开发2D图形, Surface 代表一个可供图形系统绘制的surface。可在其上绘制2D活3D图形。


二. frameworks/base/opengl/
这个目录包含opengel的接口以及软件实现。在http://developer.android.com/guide/topics/graphics/opengl.html有详细介绍如何使用android.opengl开发3d graphics。

三.external/skia,台湾的Jserv先生有一篇比较好的介绍,感兴趣的读者可以参考他的博文(http: //blog.linux.org.tw/~jserv/archives/002095.html)。简而言之,skia与cairo功能相当,封装底层的图形硬件,为上面的图形库提供最基础的操作图形硬件的原语。

四. frameworks/base/libs/ui 和 frameworks/base/libs/surfaceflinger
ISurface 定义了基础的Surface接口,供图形系统客户端(应用)和server端(即surfaceflinger)交互。
BpSurface是ISurface的派生类,提供接口供server 调用客户端功能;
BnSurface是ISurface的另一个派生类,提供接口供客户端调用server功能。当 server 收到来自客户端(通过BnSurace)的调用请求后,如registerBuffers, postBuffer等,BnSurface::onTransact被触发。
Surface (LayerBaseClient的私有类)是BnSurface的派生类。
SurfaceBuffer (SurfaceBuffer的私有类)是Surface的派生类。

ISurfaceComposer 定义了基础的接口,供客户端和server端交互。
BpSurfaceComposer是一个派生类,提供接口供server调用客户端功能;
BnSurfaceComposer是另一派生类,提供接口供客户端调用server功能。类 SurfaceFlinger 由BnSurfaceComposer派生而来。

SurfaceComposerClient直接供客户端使用,调用ISurface (BnSurface)和 ISurfaceComposer (BnSurfaceComposer)以及 ISurfaceFlingerClient 接口,与server交互。

BClient 派生自ISurfaceFlingerClient (BnSurfaceFlingerClient),调用server的createSurface,真正创建一个surface。每个surface对应一个layer.

egl_native_window_t 定义了一个本地window类 。这个类提供了对本地window的所有描述以及用于egl (opengl 与本地图形系统的接口)操作本地windwo的所有方法。
EGLNativeSurface是egl_native_window_t的一个派生类。
EGLDisplaySurface是EGLNativeSurface的派生类。 EGLDisplaySurface 是一个非常重要的类,在这个类里,真正打开framebuffer设备(/dev/graphics/fb0 或者/dev/fb0),并将这个设备封装成EGLDisplaySurface的形式供server使用。函数mapFrameBuffer打开framebuffer, 创建两个缓冲区,(一个是on screen front 缓冲区, 另一个back buffer, 可能位于offscreen framebuffer,也可能位于系统内存)。 函数swapBuffers将back buffer内容拷贝到front buffer中。

DisplayHardware 类中初始化了egl系统,并为本地窗口对象EGLDisplaySurface 创建了对应的EGLSurface 对象。surfaceflinger 使用DisplayHardware去和本地窗口打交道。



五、下列目录中的部分代码
7、frameworks/base/core/jni/android/graphics
8、frameworks/base/core/jni/android/opengl
9、frameworks/base/core/jni/android/android_view_*.cpp

这些目录下的代码在Java层的graphics 组件和native (c++)组件之间衔接,将java层的功能调用转换到对应的本地调用。

hardware/libhardware实现了HAL(Hardware Abstraction Layer)层,copybit device是其中一个模块。

android中,与图形相关的上层java package包括:
android.graphics,
android.view,
android.widget
android.opengl

android.graphics, android.view和android.widget功能和其他类似的图形库如Qt/Gtk+差不多,分别提供基本的图形原语(如画点画线,设置图形上下文等),事件机制,以及开发图形用户界面的控件等。canvas 用于开发2D图形,而android.opengl用于开发3d graphics,在http://developer.android.com/guide/topics/graphics/opengl.html有详细介绍如何使用。

本文重点放在研究android.graphics之下的和图形硬件设备交互的层。

Canvas: the Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing). Via the Canvas, your drawing is actually performed upon an underlying Bitmap, which is placed into the window

The window is tied to a Surface and the ViewRoot asks the Surface for a
Canvas that is then used by the Views to draw onto. After View draw its data to canvas, ViewRoot
will call surface.unlockCanvasAndPost(canvas) to schedule surfaceFlinger::composeSurfaces() which do the actually display to display panel. SurfaceFlinger handles to transfers drawn data in canvas to surface front buffer or backbuffer

Except for SurfaceViews, different views within the same ViewRoot share the same surface.


frameworks/base/graphics/java/android/graphics/Canvas.java 提供基础的绘制图形原语。
frameworks/base/core/jni/android/graphics/Canvas.cpp 提供native的绘制图形原语。Canvas.java中的函数通过JNI调用Canvas.cpp中的函数。但Canvas.cpp中的函数并不是最终实现,仅仅是一个中间函数。
external/skia/src/core/SkCanvas.cpp提供最终函数实现。Canvas可以画在一个bitmap上,之后传给surface。

Java API 包括Surface.java 以及 SurfaceSession.java,由客户端应用使用;对应的c++代码创建SurfaceComposerClient。而 SurfaceComposerClient建立与surfaceflinger server的连接。

Surface的概念:
每个surface有一个front buffer和一个back buffer。每个window有一个对应的surface. window内容绘制在view的bitmap后传给surface。surface作为一个service提供给系统使用,由service manager(frameworks/base/services/java/com/android/server/SystemSever.java, frameworks/base/cmds/system_server/library/system_init.cpp)初始化。surface server的代码位于frameworks/base/libs/surfaceflinger下。



frameworks/base/libs/ui下提供:
EGLDisplaySurface.cpp 中函数真正和图形设备framebuffer打交道。函数mapFrameBuffer打开图形设备framebuffer(/dev/graphics/fb0或者/dev/fb0),然后定义framebuffer的frontbuffer和backbuffer。backbuffer可能位于framebuffer上,也可能是一块system memory(由malloc分配),然后函数swapBuffers将back buffer内容拷贝到front buffer中。如果copybit device实现的话,拷贝可以使用硬件加速。

hardware/libhardware实现了HAL(Hardware Abstraction Layer)层,copybit device是其中一个模块。

frameworks/base/libs/surfaceflinger中提供:
DisplayHardware/DisplayHardware.cpp调用EGLDisplaySurface.cpp中的函数,初始化egl library,创建EGLSurface



Android屏幕截图背后的SurfaceFlinger:从screencap源码看图形系统如何工作 本文深入解析Android屏幕截图背后的技术原理,重点剖析screencap命令的执行流程及SurfaceFlinger的核心作用。通过分析图形系统的分层架构、GraphicBuffer管理以及截图数据的处理与保存,揭示Android图形系统如何高效完成屏幕截图任务,为开发者优化截图性能提供技术参考。 阅读详情

相关推荐

Android图形系统之SurfaceFlinger/OpenGL/HWC/Gralloc/FrameBufer/ION/GPU等关系(十三)

本篇目的:理解SurfaceFlinger/OpenGL/HWC/Gralloc/FrameBufer/ION关系。

Android系统攻城狮 1561

Android核心分析(26)-----Android GDI之SurfaceFlinger

Android GDI之SurfaceFlinger SurfaceFinger按英文翻译过来就是Surface投递者。SufaceFlinger的构成并不是太复杂,复杂的是他的客户端建构。SufaceFlinger主要功能是: 1) 将Layers (Surfaces) 内容的刷新到屏幕上 2) 维持Layer的Zorder序列,并对Layer最终输出做出裁剪计算。 3) 响应Client要求,创建Layer与客户端的Surface建立连接 4) 接收Client要求,修改Layer属性(输出大

maxleng的专栏 6万+

Android 进阶——图形系统的“幕后推手” SurfaceFlinger 与 Surface 协同机制剖析

本文深入剖析了Android图形系统中SurfaceFlinger与Surface的协同工作机制。作为图形渲染的核心组件,SurfaceFlinger负责高效管理多个Surface图层,实现60fps甚至120fps的流畅合成。文章详细讲解了Surface生命周期、跨进程通信机制、图层合成原理,并提供了性能优化实战经验和调试工具使用技巧,帮助开发者深入理解Android图形系统的底层实现。

weixin_30319153的博客 179

Android Surface 介绍

<br />转自[url=http://blog.sina.com.cn/s/blog_5e71b14f0100c75g.html~type=v5_one& amp;label=rela_nextarticle]http://blog.sina.com.cn/s/blog_5e71b14f0100c75g.html~type=v5_one&label=rela_nextarticle[/url]<br /><br /> Android 技术专题系列之九 -- 图形系统<br /> 本文试图讲述Andr

mlianghua的专栏 3552

Android图形系统概述

图形系统是Android中非常重要的子系统,与其他子系统相互协作,完成图形界面的渲染和显示。 概述 官方提供了一个图形系统的关键组件协作图,如下所示:这幅图大致描述了图形数据的流转:OpenGL ES、MediaPlayer等生产者生产图形数据到Surface,Surface通过IGraphicBufferProducer把GraphicBuffer跨进程传输给消费者SurfaceFlinger,...

tli600605的专栏 803

探索Android 2.3.4 SurfaceFlinger源码:图形系统深入剖析

硬件加速是一种利用特定的硬件资源来加速计算过程的技术,它能够显著提高图形处理的效率。在移动设备和嵌入式系统中,GPU(图形处理单元)是实现硬件加速的关键组件。与CPU相比,GPU拥有更高的并行计算能力,能够同时处理成百上千的图形渲染任务,从而大幅缩短渲染时间。硬件加速的原理主要基于图形管线(Graphics Pipeline),这个管线被分为多个阶段,每个阶段都有专门的处理单元。当应用程序需要渲染图形时,图形命令和数据首先被发送到GPU,然后按照管线的顺序被处理。

weixin_34547628的博客 856

android多媒体框架介绍(五)显示图形系统之SurfaceFlinger初步介绍

前面介绍了比较直观的framebuffer模块(负责把有一个内存地址ADDR的内容显示到屏上),hwc模块(叠加器,负责把surfaceFlinger送来的各种输入layer叠加到显存上),接下来开始介绍surfaceFLinger这个android显示相关最核心的系统服务。 文章目录一、SurfaceFlinger定义与概念Surface定义---供生产方与消耗方交换图形buf缓冲区SurfaceFlinger定义---统一管理surface的合成显示系统服务SurfaceFlinger基础规格Surfa

runafterhit的博客 8597

Skyworks SKY85331-11的Wi-Fi 6 (802.11ax)标准 2.4G 高功率WLAN前端模块解决方案

SKY85331-11是高度集成的2 GHz前端模块(FEM)包含2 GHz单刀双掷(SPDT)发送/接收(T / R)开关,2 GHz低噪声放大器(LNA)带旁路和一个2 GHz功率放大器(PA),用于大功率802.11ax应用程序和系统LNA和PA禁用功能可确保低漏电流 关闭模式。 包括一个集成的功率检测器以提供系统内的闭环功率控制。该设备提供Small (24-pin, 3 x 5 mm) (LGA)封装。 图1.引脚配置和封装如图所示 图2.信号引脚分配和功能引脚描述 图...

zhangbao19890622的博客 4503

Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析

文章转载至优快云社区罗升阳的安卓之旅,原文地址:http://blog.youkuaiyun.com/luoshengyang/article/details/8303098 在前文中,我们分析了应用程序窗口连接到WindowManagerService服务的过程。在这个过程中,WindowManagerService服务会为应用程序窗口创建过一个到SurfaceFlinger服务的连接。有了这个连接之后...

weixin_34055787的博客 125

Caffeine:为每个元素动态设置过期时间

Caffeine利用expireAfter方法实现为每个元素动态设置过期时间

大数据开发、JAVA开发、人工智能AI 1万+

Windows 10 本地开发环境:用 ShardingSphere-Proxy 5.4.1 快速搭建 MySQL 分库分表测试环境

本文详细介绍了在Windows 10系统中使用ShardingSphere-Proxy 5.4.1快速搭建MySQL分库分表测试环境的完整教程。从环境准备、MySQL配置到ShardingSphere-Proxy的核心设置,逐步指导开发者完成本地开发环境的搭建,并提供了分片策略详解和常见问题排查方法,帮助开发者高效验证分库分表功能。

weixin_28366053的博客 214

Android 图形系统之七:SurfaceFlinger

SurfaceFlinger 是 Android 系统中一个极为关键的系统服务,处于图形显示架构的核心位置,主要负责将各个应用层提供的 Surface(代表可视化的界面元素)进行合成,并最终输出到屏幕显示,起到了承上启下的桥梁作用,衔接应用层与硬件显示层。

执剑人 8839

RDD2022 数据格式转换与清洗

Rdd2022数据集,是关于道路损伤的数据集,与rdd2020相比增加了两万多张图片但是由于格式不能被yolo直接使用且其中有大量的图片没有符合要求的标注,特写此文章记录数据清洗与格式化的过程。

蓝胖子的博客 9946

深入解析 Android 图形系统:Canvas、Skia、OpenGL 与 SurfaceFlinger 的协作

在 Android 应用开发中,流畅的 UI 渲染是用户体验的核心。但你是否好奇,一个简单的 `View` 是如何从代码中的 `onDraw()` 方法一步步变成屏幕上的像素的?本文将从底层图形系统的视角,解析 Android 中 `Canvas`、Skia、OpenGL ES 和 `SurfaceFlinger` 的协作关系,并揭秘软绘制与硬绘制的完整流程。

居然是阿松的博客 2096

Ubuntu终端一键安装英伟达驱动:无需手动下载的完整指南

本文提供了一份在Ubuntu系统上通过终端命令一键安装英伟达显卡驱动的完整指南。该方法利用官方PPA源,无需手动下载驱动文件,可自动检测硬件并安装最佳版本,极大简化了流程,适合深度学习环境搭建等场景,有效提升安装效率与稳定性。

weixin_29232121的博客 180

5分钟搞定!用OpenCV实现全景图像柱面展开的保姆级教程(附完整代码)

本文提供了一份使用OpenCV实现全景图像柱面展开的详细教程。通过清晰的数学原理讲解和分步代码演示,指导读者快速掌握从等距柱状投影全景图到平面展开图的核心转换方法,并涵盖性能优化、参数调整及透视视图扩展等实用技巧,适合图像处理爱好者和开发者实践。

sony5的博客 571

一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系

一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系 2018年03月08日 13:49:11 阅读数:623 标签: SurfaceFlingerSurfaceAndroid图形系统 更多 个人分类: Android进阶 所属专栏: Android进阶 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csd...

jhope的专栏 552

别再只用相机标定了!手把手教你用OpenCV和Python搞定投影仪标定(附完整代码)

本文详细介绍了如何使用Python和OpenCV实现投影仪标定,特别针对结构光三维扫描中的核心问题。通过低成本替代方案和优化算法,解决投影仪标定中的非线性畸变和亮度-距离耦合效应,显著提升三维重建精度。附完整代码和实战技巧,帮助开发者快速掌握关键技术。

weixin_29274337的博客 541

Android 源码 图形系统之 SurfaceFlinger 服务启动

SurfaceFlinger 服务起点在 init.rc 中。boot Action 中最后 class_start 命令启动了分类为 core 的所有服务,这其中就包括 surfaceflinger。 system/core/rootdir/init.rc on boot ...... class_start core ...... service surfaceflinger /system/bin/surfaceflinger class core user syste

洪伟的专栏 1863

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案

Android Studio无法启动,Failed to create JVM:error code -1. JVM Path 完美解决方案。 找到Android studio的启动文件bin目录,把studio64.exe.vmoptions 删除或改名(推荐改名,方便恢复),如果你是32位系统这个文件就是 studio.exe.vmoptions

陈万洲的专栏 4849

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android Q 图形系统探秘:从 ViewRootImpl 到 SurfaceFlinger,一次完整的 Surface 创建之旅

本文深入解析Android Q图形系统中Surface的创建过程,从应用层的ViewRootImpl到WindowManagerService,再到SurfaceFlinger的完整链路。详细介绍了SurfaceControl的初始化、BufferQueueLayer的创建以及生产者-消费者模型的建立,帮助开发者理解Android图形系统的核心机制。

weixin_42692935的博客 101

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android surfaceflinger目录,一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系...

Android - SurfaceFlinger 图形系统相关系列一篇文章看明白 Android 系统启动时都干了什么一篇文章了解相见恨晚的 Android Binder 进程间通讯机制一篇文章看明白 Android 从点击应用图标到界面显示的过程一篇文章看明白 Activity 与 Window 与 View 之间的关系一篇文章看明白 Android 图形系统 Surface 与 Surface...

weixin_42386504的博客 331

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android图形系统实战:Skia绘制与SurfaceFlinger合成如何协同工作?

本文深入解析Android图形系统中Skia绘制与SurfaceFlinger合成的协同工作机制。通过剖析Skia的2D图形绘制流程和SurfaceFlinger的图层合成策略,揭示从UI元素绘制到屏幕显示的高效链路,并提供性能优化实践与调试技巧,帮助开发者提升图形渲染效率。

ruby5的博客 1054

Android图形系统之SurfaceFlinger与WindowManager(八)

SurfaceFlinger 接受缓冲区,对它们进行合成,然后发送到屏幕。WindowManager 为 SurfaceFlinger 提供缓冲区和窗口元数据,而 SurfaceFlinger 可使用这些信息将 Surface 合成到屏幕。 SurfaceFlinger SurfaceFlinger 可通过两种方式接受缓冲区:通过 BufferQueue 和 SurfaceControl,或通过 ASurfaceControl。 SurfaceFlinger 接受缓冲区的一种方式是通过 BufferQu

Android系统攻城狮 1231
上一篇: 多重继承与虚继承
下一篇: 详解Android Surface系统
learnerz
博客等级 码龄16年 51粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值