You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 8.0+基于OpenGL ES 3.0获取GPU内存与使用率的方案问询

适配Android 8.0+的通用GPU内存/使用率获取方案

针对你开发OpenGL ES 3.0 Android应用时遇到的NVX扩展仅支持Nvidia设备的问题,以下是几种跨厂商的可行方案:

1. 利用Android系统API获取总GPU内存(Android 10+)

Android 10(API 29)及以上提供了官方API直接获取GPU最大内存,这是最稳定的途径:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    GraphicsEnvironment graphicsEnv = GraphicsEnvironment.getLocalGraphicsEnvironment();
    for (GraphicsDevice device : graphicsEnv.getGraphicsDevices()) {
        long totalGpuBytes = device.getMaximumMemorySize();
        float totalGpuMb = totalGpuBytes / (1024f * 1024f);
        // 此处可处理总GPU内存数据
    }
}

2. 适配不同GPU厂商的扩展与系统节点

由于OpenGL ES没有统一的内存查询标准扩展,需针对主流GPU厂商做适配:

// 获取设备支持的所有OpenGL ES扩展
String supportedExtensions = GLES30.glGetString(GLES30.GL_EXTENSIONS);

// AMD GPU:通过GL_AMD_gpu_memory_info扩展获取内存数据
if (supportedExtensions.contains("GL_AMD_gpu_memory_info")) {
    int[] totalMem = new int[1];
    int[] usedMem = new int[1];
    // 总显存(单位:KB)
    GLES30.glGetIntegerv(0x9146, totalMem, 0);
    // 已使用显存(单位:KB)
    GLES30.glGetIntegerv(0x9147, usedMem, 0);
    
    float totalMb = totalMem[0] / 1024f;
    float usedMb = usedMem[0] / 1024f;
    float usageRate = (usedMb / totalMb) * 100;
    // 此处可处理内存使用率数据
}

// 高通Adreno GPU:读取sysfs节点(需文件读取权限)
// 注意:Android 10+需申请MANAGE_EXTERNAL_STORAGE权限,部分设备可能限制访问
if (supportedExtensions.contains("GL_QCOM_memory_object")) {
    try {
        File memInfoFile = new File("/sys/class/kgsl/kgsl-3d0/meminfo");
        BufferedReader reader = new BufferedReader(new FileReader(memInfoFile));
        String line;
        while ((line = reader.readLine()) != null) {
            if (line.startsWith("total:")) {
                long totalBytes = Long.parseLong(line.split(":")[1].trim());
                float totalMb = totalBytes / (1024f * 1024f);
            } else if (line.startsWith("used:")) {
                long usedBytes = Long.parseLong(line.split(":")[1].trim());
                float usedMb = usedBytes / (1024f * 1024f);
            }
        }
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// ARM Mali GPU:读取sysfs节点(需文件读取权限)
try {
    File memInfoFile = new File("/sys/devices/platform/mali.0/meminfo");
    BufferedReader reader = new BufferedReader(new FileReader(memInfoFile));
    String line;
    while ((line = reader.readLine()) != null) {
        if (line.startsWith("total:")) {
            long totalKb = Long.parseLong(line.split(":")[1].trim());
            float totalMb = totalKb / 1024f;
        } else if (line.startsWith("used:")) {
            long usedKb = Long.parseLong(line.split(":")[1].trim());
            float usedMb = usedKb / 1024f;
        }
    }
    reader.close();
} catch (IOException e) {
    e.printStackTrace();
}

3. 兼容性处理建议

  • 优先使用Android 10+的系统API,避免依赖厂商私有扩展或系统节点;
  • 对Android 8.0-9.0设备,通过「检测厂商扩展+读取sysfs节点」的组合方式兼容;
  • 读取sysfs文件时,需处理权限申请和文件路径不存在的异常(不同设备节点路径可能有差异);
  • 内存使用率数据仅能通过厂商扩展或sysfs获取,系统API暂无通用接口。

内容的提问来源于stack exchange,提问作者I_Cheems

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:20:28