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
相关推荐
2501_915921432 小时前
在 Linux 上通过命令行上架 iOS APP,Fastlane + AppUploader(开心上架)
android·linux·运维·ios·小程序·uni-app·iphone
2501_915921433 小时前
从构建到 IPA 保护,Flutter iOS 包如何做混淆与安全处理
android·安全·flutter·ios·小程序·uni-app·iphone
2501_916008893 小时前
iPhone 手机硬件组件使用耗能历史记录查看,能耗查看
android·ios·智能手机·小程序·uni-app·iphone·webview
峥嵘life3 小时前
Android16 EDLA更新25-12补丁导致【CTS】CtsWindowManagerDeviceAnimations存在fail项
android·linux·学习
13 小时前
深度解析Compose中的BoxWithConstraints
android·kotlin·android jetpack
jolimark13 小时前
MySQL--》如何在MySQL中打造高效优化索引
android·mysql·adb
book123_0_9913 小时前
【MySQL】MySQL函数之JSON_EXTRACT
android·mysql·json
冬奇Lab14 小时前
ContentProvider与Uri权限:跨应用数据共享
android·源码阅读
峥嵘life14 小时前
Android16 【GTS】 GtsDevicePolicyTestCases 测试存在Failed项
android·linux·学习