android 显示架构学习笔记

本文深入探讨了OpenGL在Android系统中的作用,包括其软件和硬件方案的实现方式,以及如何与libui、SurfaceFlinger和OpenGL本身协同工作以完成图像处理和显示任务。重点介绍了OpenGL在Android中的接口调用流程,从开机动画到应用程序的渲染,再到SurfaceFlinger对多层图像的合成与显示,涵盖了OpenGL在不同场景下的应用。
1 display系统openGL 的关系
openGL 是一个图像处理引擎,当需要一些复杂的显示(2D/3D)操作时会用到它。它分为SW
方案和HW方案,软件方案就是图中的libagl.so,对应到目前项目中是libGLES_android.so,
它可以完成简单的2D(文字,icon等)处理,通过trace看目前大部分显示操作都是它来完成的。
Note:它是软件方案,处理好的数据是通过copybit送到framebuffer的,而不是GPU。
其接口部分参考:android\frameworks\base\opengl\libagl
HW方案就是图中的Graphics
driver,它通过使用GPU硬件来完成图像处理,处理后的数据直接送到framebuffer中。其接口部分参考:android\frameworks\base\opengl\libs(有几个版本)

2
android的普通显示就直接用libui库的接口实现,需要2D,3D加速的时候在调用openGL
,libui库通过一个hal层和frambuffer联系,openGL则有软件(通过copybit和frambuffer联系),硬件(通过GPU和frambuffer联系)

3 surfaceflinger担任是一个管理的职责,对于效果处理及合成它是通过OpenGL来做的
,但前提是surfaceflinger需要把相关参数计算好,如重叠的位置等,
Surfaceflinger 使用 OpenGL 来合成 surface ,所以 surfaceflinger 会直接调用到
OpenGL 的接口。
在android中有两三大模块会调用到egl接口
    1、开机动画
frameworks\base\cmds\bootanimation\BootAnimation.cpp
--> BootAnimation::readyToRun()
    2、应用程序,通过 com_google_android_gles_jni_EGLImpl.cpp
   中的JNI接口直接调用
    3、SurfaceFlinger 图形合成进程调用,这一块是最复杂也是移植的核心部分所在
    这块没有直接调用eglxx接口,而是经过了一层封装:
    DisplayHardware.cpp --> DisplayHardware::init
    frameworks/base/opengl/libs/egl/egl.cpp 中封装实现,这里最终都是调用
    cnx->egl.eglxx()接口


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

5 surfaceflinger
中管理着大量的layer,它把这些layer提供给上层应用来绘制UI,然后
surfaceflinger会通过一系列的操作吧这些layer合成一屏图像数据,提供给framebuffer
显示出来。

6 libpixelflinger
pixelflinger 是android中一个下层的工具类型库,负责像素级别的基本处理,例如:
提供像素格式定义,画点,画线,画多边形纹理颜色填充以及多层处理等操作。


7 surfaceflinger利用openGL 进行layer的合并,之后再把这一屏的内容通过openGL
显示出来,当然openGL也是通过libui来送到frambuffer来显示的。
openGL 的显示过程,不管是硬件还是软件,都是在eglswapBuffer中通过libui的frambufferNativeWindow
的queuebuffer函数来操作framebuffer的。

8 surfaceflinger 通过openGL来合成图层过程
surfaceflinger中  handleRrpaint--》composesurface等-->onDraw-->一系列openGL
api。之后就调openGL的接口了。
此后工作就交给openGL了,软件实现中openGL 还会用到libpixeflinger库来进行像素
合成的一些工作,和硬件实现的openGL 是完全自己实现的(我接触的vivante是这样的)
一、项目简介 本项目(HF24075 SDFeatureRivertraining)是一套以多路 PWM 多彩 LED 灯光控制为核心的固件方案,基于 PADAUK PMS 系列单片机。方案对蓝、青、粉等多色 LED 进行独立 PWM 调光,实现呼吸、渐变、流水等细腻灯光效果,并支持按键切换与传感器交互。其 PWM 调光结构清晰,是学习单片机 PWM、色彩混合与灯光算法的理想范例。 核心应用场景: 1. 氛围灯 / 流水灯产品开发 2. PWM 调光与色彩混合学习 3. 电子类课程设计 / 毕业设计 4. 灯光艺术与 DIY 项目 适配使用场景:学习练手、毕业设计、课程设计、创业售卖、实操实训,突出实用性与可落地性。 二、硬件核心配置 · 主控芯片:PADAUK(应广科技)PMS 系列 8 位 OTP 单片机 · 外接外设: - 多色 LED 灯组(蓝 / 青 / 粉等多路独立 PWM) - 轻触按键(模式切换) - 传感器(交互触发) · 操控设备: - 机身实体按键操控 三、核心功能介绍 1. 多路独立 PWM 调光:蓝、青、粉等 LED 各自独立占空比控制,实现精准亮度; 2. 呼吸 / 渐变 / 流水效果:通过 PWM 变化曲线营造丰富灯光律动; 3. 按键切换模式:轻触在多种灯效间循环切换; 4. 传感器交互:外部传感信号触发或联动灯光变化; 5. 低功耗设计:闲置进入低功耗,按需唤醒。 6. 参数可配:亮灭周期、渐变速度等可调,便于定制。 四、项目优势与亮点 · 灯光细腻:多路独立 PWM,效果远胜简单开关灯。 · 算法清晰:呼吸 / 渐变实现简洁,易于理解与移植。 · 扩展性强:可轻松增加颜色与模式,适配各类灯饰。 ·
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值