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.egl,ro.hardware.egl和ro.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
相关推荐
半摆烂日常8 小时前
低代码平台API对接实践:接口鉴权与数据同步的完整实现
android·低代码·rxjava
事圆则缓9 小时前
volatile 使用场景全解析:它能保证什么,又解决不了什么
android
蒲公英内测分发10 小时前
智能投影仪参加海外展会,未上架的 Android 配套 App 怎么让客户限时试用?
android
ii_best10 小时前
按键精灵手机端开发安卓版实战:手写一个可最小化、可拖动的「运行日志悬浮窗」(附完整 源码 + 踩坑记录)
android·ios·智能手机·自动化·ai编程·按键精灵
终端安全笔记10 小时前
安卓做 MDM 管控,先分清三种注册入口
android·安全·智能手机
乌萨达11 小时前
手机模拟器安卓怎么用?电脑安装应用、玩手游与账号同步指南
android·智能手机·电脑·雷电模拟器
美狐美颜SDK开放平台11 小时前
Android与iOS直播APP美颜有什么区别?视频美颜SDK开发详解
android·ios·音视频·视频美颜sdk
春猿火13 小时前
某市-2026【网安·论道】misc-afterimage_note-wp
android
恋猫de小郭14 小时前
Shopify 回应为什么从 RN 回到原生,为什么不用 KMP ?
android·前端·flutter
fundroid16 小时前
Android AI 开发,真正拉开差距的是工程闭环
android·ai·大模型·agent