Android Graphics - openGL and Vulkan小结

1. openGL(open Graphic library):

核心职责:

  • openGL是API规范(应用程序编程接口)
  • 定义了一系列用于渲染2D和3D矢量图形的函数

主要目标:

  • 将复杂的图形硬件操作抽象化,为开发者提供一个统一的、硬件无关的编程接口。
  • 允许开发者高效地利用GPU进行渲染。
  • 实现跨操作系统(Windows, Linux, macOS, Android等)和跨硬件平台的图形应用开发。

openGL ES

openGL ES(embedded system) 是openGL的子集,在openGL 的基础上专门为移动/嵌入式设备设计的。

在Android platform的实现:
硬件厂商
Android 框架
应用程序
libGLESv2.so
frameworks/native/opengl/libs:

• EGL 实现

• GLES 命令转发

• 状态跟踪
libGLESv2_adreno.so

libGLESv2_mali.so
GPU

EGL

EGL是Khronos协会定义的interface,用于连接Android平台和 OpenGL ES; 可以用于窗口surface,还用于上下文管理和同步。Android提供给的libEGL.so只是提供了一套标准的调用接口和灵活的加载机制,可以使系统选择合适的图形后端,在实际项目中的vendor/lib64/egl/目录下有如下文件:

在Android 13代码上,相关的加载在Loder.cpp中;

eglApi.cpp是入口,egl_platform_entried.cpp是平台转发层,转发时会根据加载时得到的函数指针调用到GPU 供应商提供的so中。

EGL存在的原因?(下面的答案是从DeepSeek的回答中提取的,需要确认)

"openGL ES在Android 1.0就已经集成,但是当时移动GPU能力有限,需要软件回退,Android提供了统一的EGL实现。"

也就是说早期GPU能力有限,需要软件实现部分功能吧。

Android 封装代码

下面是Android对openGL ES的封装层,具体实现由硬件厂商提供。

  • frameworks/native/opengl

Loader.cpp 通过 persist.graphics.eglro.hardware.eglro.board.platform来获取 libname ,然后查找并加载libGLES_libname .so, libEGL_libname .so, libGLESv1_CM_libname .so和libGLESv2_libname.so。


Vulkan

Vulkan是Khronos协会发布的下一代openGL(本身存在一些问题),那么目的是在未来取代openGL。

在Android platform的实现:
GPU 厂商驱动 Android Vulkan层 App GPU 厂商驱动 Android Vulkan层 App vkCreateInstance() 加载 vulkan.<platform>.so 返回驱动句柄 返回VkInstance vkCreateAndroidSurfaceKHR(window) 转换ANativeWindow->>VkSurface 返回VkSurface 返回VkSurface vkCmdDraw() (直接调用) 提交绘图命令 执行完成 返回
硬件厂商
Android 框架
应用程序
libvulkan.so
frameworks/native/vulkan:

• ICD 加载

• 平台扩展

• 验证层
vulkan.adreno.so

vulkan.mali.so
GPU

Android 封装代码

下面是Android对Vulkan的封装层,具体实现由硬件厂商提供。

  • frameworks/native/vulkan

driver.cpp通过"ro.hardware.vulkan" 和 "ro.board.platform"来获取 lib_name ,然后查找并加载vendor.lib_name.so;实际项目中在 "vendor/lib64/hw/"路径下安装有相应的so。


总结openGL ES和Vulkan

  1. 通过下面的flowchart(deepseek提供),可以看清楚openGL ES,EGL和Vulkan的作用:

    Rendering APIs
    Graphics Interface
    Android/Linux/Windows

    1. 提供原生窗口
      Surface/SurfaceTexture 2. 创建渲染上下文
      管理图形资源 可选支持
      直接访问
    2. 发送渲染指令 直接控制
      Native Platform

    原生窗口系统
    EGL

    渲染上下文管理器
    OpenGL ES

    高级图形API
    Vulkan

    低级图形API
    GPU

  2. openGL ES和Vulkan是两套规范,定义了一些操作GPU的API,方便开发者更好的作图形开发,而这些API的具体实现由硬件厂商提供;Android作为platform,对两个规范做了一些相关封装以便平台开发者的使用。

    EGL是Android的实现

  3. 下面是Google对openGL ES和Vulkan规范的实现源码(纯CPU实现)


GLES,Vulkan和 Hardware Composer(HWC)的对比(由DeepSeek提供):

  1. 核心特性对比

    特性 OpenGL ES (GLES) Vulkan Hardware Composer (HWC)
    定位 高级图形渲染API 低级图形与计算API 显示合成硬件抽象层
    设计目标 跨平台易用性 极致性能与控制 低功耗显示输出
    标准组织 Khronos Group Khronos Group Android 专属
    架构类型 状态机驱动 显式控制 硬件抽象层
    上下文管理 全局状态 多实例显式管理 无状态
    内存管理 自动管理 手动显式控制 硬件管理
    线程模型 单上下文单线程 原生多线程支持 系统服务单线程
    首次引入 Android 1.0 (2008) Android 7.0 (2016) Android 4.0 (2011)
    主要用途 应用内容渲染 高性能渲染/计算 图层合成与显示
    工作层级 应用层 应用层 系统服务层

  1. 性能指标对比

    性能指标 GLES Vulkan HWC
    合成延迟 8-12ms 3-5ms 0.5-2ms
    CPU占用率 高 (15-25%) 中 (5-10%) 极低 (< 3%)
    GPU占用率 高 (30-60%) 中 (15-30%) 0%
    功耗效率 低 (200-400mW) 中 (100-200mW) 极低 (10-50mW)
    多图层支持 6-8层 16-32层 16+层
    最大帧率 60fps@1080p 120fps@4K 240fps@FHD
    内存带宽 高 (25GB/s+) 中 (15GB/s) 极低 (5GB/s)
    驱动开销 高 (8-12μs/call) 低 (1-2μs/call) N/A
    初始化时间 10-20ms 50-100ms 5-10ms
    多线程扩展性 优秀 N/A

    测试基准:Snapdragon 8 Gen 2,Android 13,1080p@120Hz


功能特性对比

  1. 渲染能力

    功能 GLES Vulkan HWC
    3D 渲染 ★★★ ★★★
    2D UI 渲染 ★★★ ★★
    顶点处理 ★★ ★★★
    片段处理 ★★★ ★★★
    计算着色器 ★★ (ES 3.1+) ★★★
    光线追踪 ★ (扩展)
    多视图渲染
    异步计算 ★★★
  2. 合成能力

    功能 GLES Vulkan HWC
    图层混合 ★★★ ★★ ★★★
    Alpha 合成 ★★★ ★★ ★★★
    色彩校正 ★★ ★★ ★★★
    HDR 处理 ★★ ★★★ ★★★
    动态刷新率 ★★★
    低延迟显示 ★★ ★★★
    旋转缩放 ★★ ★★★
    视频叠加 ★★★
  3. 特殊功能

    功能 GLES Vulkan HWC
    硬件覆盖层 ★★★
    面板自刷新 ★★★
    直接扫描输出 ★★★
    多显示器支持 ★★ ★★★
    保护路径 ★★ ★★★
    色彩空间转换 ★★ ★★★
    元数据传递 ★★★
    帧率同步 ★★★

  • external/vulkan-headers/Android.bp

    mk 复制代码
    ndk_headers {
        name: "ndk_vulkan_headers",
        from: "include",
        to: "",
        srcs: [
            "include/**/*.h",
        ],
        license: "LICENSES/Apache-2.0.txt",
        // The Vulkan headers aren't self-contained. vulkan_fuchsia.h, at the very
        // least, requires other headers to be included first.
        //
        // Low risk to disable verification here since upstream also cares about
        // C-compatibility. Can remove if upstream ever decides they want to
        // guarantee self-contained headers as well.
        skip_verification: true,
    }

openGL ES 和 Vulkan依赖的native 库有哪些?

比如是否依赖libnativewindow.so

  • frameworks/base/opengl
    Java code,有GLSurfaceView等
  • frameworks/base/core/jni
    • android_opengl_GLES10.cpp
  • frameworks/native/libs/nativewindow/include/system/window.h
    ANativeWindow
相关推荐
常利兵17 分钟前
解锁Kotlin:数据类与密封类的奇妙之旅
android·开发语言·kotlin
sunfdf1 小时前
无需密码即可解锁 Android 手机的 5 种方法
android·智能手机
Ln5x9qZC24 小时前
Laravel AI SDK 正式发布
android·人工智能·laravel
huwuhang5 小时前
跨平台电子书阅读器 | Readest最新版 安卓版+PC版全平台
android·前端·javascript
Gse0a362g6 小时前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
android·开发语言·php
十六年开源服务商6 小时前
WordPress服务器响应时间优化终极指南2026
android·运维·服务器
jwn9996 小时前
PHP vs Go:后端开发选谁更胜一筹?
android
Vfw3VsDKo7 小时前
Android设备搭建本地RTSP服务器(基于live555)
android·运维·服务器
九狼JIULANG7 小时前
【无标题】
android·flutter·开源·github
jwn9997 小时前
Laravel10.x新特性全解析
android