14 KiB
14 KiB
GpuInfo 使用示例
概述
GpuInfo类提供了获取设备GPU(图形处理器)详细信息的功能,包括Vulkan和OpenGL ES的硬件信息,如供应商、型号、显存、API版本、扩展等。
主要功能
- 获取GPU供应商(AMD、ARM、Qualcomm、Mali等)
- 获取GPU型号(Adreno 650、Mali-G78等)
- Vulkan API支持检测和版本信息
- OpenGL ES版本和扩展信息
- EGL版本和扩展信息
- GPU设备类型(集成显卡、独立显卡等)
- 驱动版本信息
使用方法
1. 初始化AndInfo
import com.xyzshell.andinfo.AndInfo
// 在Application或Activity中初始化
AndInfo.init(applicationContext)
2. 获取GpuInfo实例
val gpuInfo = AndInfo.instance.gpu
3. 获取GPU基本信息
供应商信息
// 获取GPU供应商名称
val vendorName = gpuInfo.getVendorName()
println("GPU供应商: $vendorName")
// 输出示例: "GPU供应商: Qualcomm" 或 "GPU供应商: ARM"
GPU型号
// 获取GPU型号/渲染器名称
val rendererName = gpuInfo.getRendererName()
println("GPU型号: $rendererName")
// 输出示例: "GPU型号: Adreno (TM) 650" 或 "GPU型号: Mali-G78"
设备类型
// 获取GPU设备类型
val deviceType = gpuInfo.getDeviceType()
val deviceTypeDesc = gpuInfo.getDeviceTypeDescription()
println("设备类型: $deviceTypeDesc")
// 输出示例: "设备类型: 集成显卡"
4. Vulkan 信息
Vulkan支持检测
// 检查是否支持Vulkan API
val isVulkanSupported = gpuInfo.isVulkanSupported()
println("Vulkan支持: ${if (isVulkanSupported) "是" else "否"}")
Vulkan API版本
// 获取Vulkan API版本
val vulkanApiVersion = gpuInfo.getVulkanApiVersion()
vulkanApiVersion?.let { version ->
println("Vulkan API版本: $version")
// 输出示例: "Vulkan API版本: 1.3.0"
}
Vulkan驱动版本
// 获取Vulkan驱动版本
val driverVersion = gpuInfo.getVulkanDriverVersion()
driverVersion?.let { version ->
println("Vulkan驱动版本: $version")
// 输出示例: "Vulkan驱动版本: 512459776"
}
5. OpenGL ES 信息
OpenGL ES版本
// 获取OpenGL ES版本
val openglVersion = gpuInfo.getOpenGLVersion()
openglVersion?.let { version ->
println("OpenGL ES版本: $version")
// 输出示例: "OpenGL ES版本: OpenGL ES 3.2 V@0490.0"
}
OpenGL ES扩展
// 获取OpenGL ES扩展列表
val openglExtensions = gpuInfo.getOpenGLExtensions()
openglExtensions?.let { extensions ->
println("OpenGL ES扩展:")
// 扩展字符串通常很长,以空格分隔
val extList = extensions.split(" ").filter { it.isNotEmpty() }
extList.take(10).forEach { ext ->
println(" - $ext")
}
println(" ...")
}
// 获取扩展数量
val extCount = gpuInfo.getOpenGLExtensionCount()
println("OpenGL ES扩展数量: $extCount")
// 输出示例: "OpenGL ES扩展数量: 156"
6. EGL 信息
EGL版本
// 获取EGL版本
val eglVersion = gpuInfo.getEglVersion()
eglVersion?.let { version ->
println("EGL版本: $version")
// 输出示例: "EGL版本: 1.5"
}
EGL扩展
// 获取EGL扩展列表
val eglExtensions = gpuInfo.getEglExtensions()
eglExtensions?.let { extensions ->
println("EGL扩展:")
extensions.take(10).forEach { ext ->
println(" - $ext")
}
println(" ...")
}
// 获取EGL扩展数量
val eglExtCount = gpuInfo.getEglExtensionCount()
println("EGL扩展数量: $eglExtCount")
// 输出示例: "EGL扩展数量: 45"
EGL客户端API
// 获取EGL支持的客户端API
val clientApis = gpuInfo.getEglClientApis()
clientApis?.let { apis ->
println("EGL客户端API: ${apis.joinToString(", ")}")
// 输出示例: "EGL客户端API: OpenGL_ES"
}
7. 获取完整GPU信息
获取原始数据
// 获取完整的GPU信息数据
val gpuData = gpuInfo.getGpuInformation()
// Vulkan物理设备列表
gpuData.vkPhysicalDevices?.forEach { device ->
println("=== Vulkan设备 ===")
println("设备名称: ${device.deviceName}")
println("设备ID: ${device.deviceId}")
println("供应商ID: 0x${device.vendorId.toString(16)}")
println("设备类型: ${device.deviceType}")
val apiVer = device.apiVersion
println("API版本: ${apiVer.major}.${apiVer.minor}.${apiVer.patch}")
if (apiVer.variant > 0) {
println("API变体: ${apiVer.variant}")
}
println("驱动版本: ${device.driverVersion}")
device.registeredVendorId?.let { vendorId ->
println("注册供应商: $vendorId")
}
}
// EGL信息
gpuData.eglInformation?.let { egl ->
println("\n=== EGL信息 ===")
egl.eglVendor?.let { println("供应商: $it") }
egl.eglVersion?.let { println("版本: $it") }
egl.eglClientApi?.let { println("客户端API: ${it.joinToString(", ")}") }
egl.eglExtensions?.let { println("扩展数量: ${it.size}") }
// OpenGL ES信息
egl.glInformation?.let { gl ->
println("\n=== OpenGL ES信息 ===")
gl.glVendor?.let { println("供应商: $it") }
gl.glRenderer?.let { println("渲染器: $it") }
gl.glVersion?.let { println("版本: $it") }
gl.glExtensions?.let {
val count = it.split(" ").filter { ext -> ext.isNotEmpty() }.size
println("扩展数量: $count")
}
}
}
获取格式化摘要
// 获取格式化的GPU信息摘要
val gpuSummary = gpuInfo.getGpuSummary()
println(gpuSummary)
8. 在Android UI中显示GPU信息
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.xyzshell.andinfo.AndInfo
class GpuInfoActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 获取GpuInfo实例
val gpuInfo = AndInfo.instance.gpu
// 显示GPU信息摘要
val textView = findViewById<TextView>(R.id.gpuInfoText)
textView.text = buildGpuInfoText(gpuInfo)
}
private fun buildGpuInfoText(gpuInfo: GpuInfo): String {
return buildString {
appendLine("=== GPU 基本信息 ===")
gpuInfo.getVendorName()?.let { appendLine("供应商: $it") }
gpuInfo.getRendererName()?.let { appendLine("型号: $it") }
gpuInfo.getDeviceTypeDescription()?.let { appendLine("类型: $it") }
appendLine("\n=== Vulkan ===")
if (gpuInfo.isVulkanSupported()) {
appendLine("支持: 是")
gpuInfo.getVulkanApiVersion()?.let { appendLine("API版本: $it") }
gpuInfo.getVulkanDriverVersion()?.let { appendLine("驱动版本: $it") }
} else {
appendLine("支持: 否")
}
appendLine("\n=== OpenGL ES ===")
gpuInfo.getOpenGLVersion()?.let { appendLine("版本: $it") }
appendLine("扩展数量: ${gpuInfo.getOpenGLExtensionCount()}")
appendLine("\n=== EGL ===")
gpuInfo.getEglVersion()?.let { appendLine("版本: $it") }
appendLine("扩展数量: ${gpuInfo.getEglExtensionCount()}")
gpuInfo.getEglClientApis()?.let {
appendLine("客户端API: ${it.joinToString(", ")}")
}
}
}
}
数据结构说明
GpuInformationData
data class GpuInformationData(
val vkPhysicalDevices: List<VkPhysicalDevice>?, // Vulkan物理设备列表
val eglInformation: EglInformation? // EGL信息
)
VkPhysicalDevice (Vulkan物理设备)
data class VkPhysicalDevice(
val apiVersion: VkVersion, // API版本
val driverVersion: Long, // 驱动版本
val vendorId: Long, // 供应商ID(PCI标准)
val registeredVendorId: VkVendorId?, // 注册的供应商ID
val deviceId: Long, // 设备ID
val deviceType: VkPhysicalDeviceType, // 设备类型
val deviceName: String, // 设备名称
)
EglInformation (EGL信息)
data class EglInformation(
val eglVendor: String?, // EGL供应商
val eglVersion: String?, // EGL版本
val eglExtensions: List<String>?, // EGL扩展列表
val eglClientApi: List<String>?, // 客户端API列表
val glInformation: GlInformation?, // OpenGL ES信息
)
GlInformation (OpenGL ES信息)
data class GlInformation(
val glVendor: String?, // OpenGL供应商
val glRenderer: String?, // 渲染器名称
val glVersion: String?, // OpenGL版本
val glExtensions: String?, // 扩展列表(空格分隔)
)
常见GPU供应商和型号
Qualcomm Adreno
- 供应商: Qualcomm
- 常见型号: Adreno 640, Adreno 650, Adreno 660, Adreno 730
- PCI ID: 0x5143
ARM Mali
- 供应商: ARM
- 常见型号: Mali-G76, Mali-G77, Mali-G78, Mali-G710
- PCI ID: 0x13B5
Imagination PowerVR
- 供应商: ImgTec
- 常见型号: PowerVR GE8320, PowerVR GM9446
- PCI ID: 0x1010
NVIDIA
- 供应商: NVIDIA
- 常见型号: Tegra系列
- PCI ID: 0x10DE
AMD
- 供应商: AMD
- 常见型号: Radeon系列
- PCI ID: 0x1002
Intel
- 供应商: Intel
- 常见型号: HD Graphics, Iris
- PCI ID: 0x8086
GPU设备类型
| 类型 | 中文名称 | 说明 |
|---|---|---|
| INTEGRATED_GPU | 集成显卡 | 集成在CPU芯片中的GPU |
| DISCRETE_GPU | 独立显卡 | 独立的GPU芯片 |
| VIRTUAL_GPU | 虚拟显卡 | 虚拟化环境中的GPU |
| CPU | CPU | 使用CPU进行图形渲染 |
| OTHER | 其他 | 其他类型 |
Vulkan供应商ID
| 供应商 | ID | 说明 |
|---|---|---|
| Khronos | 0x10001 | Khronos(科纳斯组织) |
| Vivante | 0x10002 | Vivante(维万特) |
| VeriSilicon | 0x10003 | VeriSilicon(芯原) |
| Kazan | 0x10004 | Kazan |
| Codeplay | 0x10005 | Codeplay |
| Mesa | 0x10006 | Mesa开源驱动 |
| POCL | 0x10007 | POCL |
| Mobileye | 0x10008 | Mobileye(移动眼) |
示例输出
完整GPU信息示例
=== GPU 基本信息 ===
供应商: Qualcomm
型号: Adreno (TM) 650
类型: 集成显卡
=== Vulkan 信息 ===
支持: 是
API 版本: 1.3.0
驱动版本: 512459776
--- Vulkan 设备 ---
设备名称: Adreno (TM) 650
设备 ID: 16860431361
供应商 ID: 0x5143
设备类型: 集成显卡
API 版本: 1.3.0
=== OpenGL ES 信息 ===
供应商: Qualcomm
渲染器: Adreno (TM) 650
版本: OpenGL ES 3.2 V@0490.0 (GIT@dd96402, Ie36a36c6b7, 1620286309) (Date:05/06/21)
扩展数量: 156
=== EGL 信息 ===
供应商: Android
版本: 1.5
客户端 API: OpenGL_ES
扩展数量: 45
Mali GPU示例
=== GPU 基本信息 ===
供应商: ARM
型号: Mali-G78
类型: 集成显卡
=== Vulkan 信息 ===
支持: 是
API 版本: 1.1.0
驱动版本: 28114944
=== OpenGL ES 信息 ===
供应商: ARM
渲染器: Mali-G78
版本: OpenGL ES 3.2
扩展数量: 143
注意事项
- 本地库依赖: GpuInfo需要加载本地库"andinfo",确保NDK部分正确编译
- Vulkan支持: 不是所有设备都支持Vulkan API,需要先检查
isVulkanSupported() - 设备差异: 不同设备返回的GPU信息格式可能略有不同
- 权限: 获取GPU信息通常不需要特殊权限
- 性能: GPU信息获取涉及native调用,建议在后台线程执行
- 扩展列表: OpenGL扩展字符串可能非常长(数千字符),显示时需要适当处理
典型应用场景
1. 游戏兼容性检查
fun checkGameCompatibility(): Boolean {
val gpuInfo = AndInfo.instance.gpu
// 检查Vulkan支持
if (!gpuInfo.isVulkanSupported()) {
return false
}
// 检查Vulkan API版本
val apiVersion = gpuInfo.getVulkanApiVersion()
if (apiVersion == null || apiVersion < "1.1.0") {
return false
}
// 检查是否为集成显卡或独立显卡
val deviceType = gpuInfo.getDeviceType()
return deviceType == VkPhysicalDeviceType.INTEGRATED_GPU ||
deviceType == VkPhysicalDeviceType.DISCRETE_GPU
}
2. 图形API选择
fun selectGraphicsApi(): GraphicsApi {
val gpuInfo = AndInfo.instance.gpu
return when {
// 优先使用Vulkan
gpuInfo.isVulkanSupported() -> {
val version = gpuInfo.getVulkanApiVersion()
if (version != null && version >= "1.3.0") {
GraphicsApi.VULKAN_1_3
} else {
GraphicsApi.VULKAN_1_1
}
}
// 回退到OpenGL ES
else -> {
val glVersion = gpuInfo.getOpenGLVersion()
when {
glVersion?.contains("3.2") == true -> GraphicsApi.OPENGL_ES_3_2
glVersion?.contains("3.1") == true -> GraphicsApi.OPENGL_ES_3_1
else -> GraphicsApi.OPENGL_ES_3_0
}
}
}
}
3. 性能分析和优化建议
fun analyzeGpuPerformance(): PerformanceProfile {
val gpuInfo = AndInfo.instance.gpu
val vendor = gpuInfo.getVendorName()
val renderer = gpuInfo.getRendererName()
return when {
// 高端Adreno
renderer?.contains("Adreno") == true &&
(renderer.contains("6") || renderer.contains("7")) -> {
PerformanceProfile.HIGH_END
}
// 高端Mali
renderer?.contains("Mali-G7") == true ||
renderer?.contains("Mali-G9") == true -> {
PerformanceProfile.HIGH_END
}
// 中端GPU
renderer?.contains("Adreno 5") == true ||
renderer?.contains("Mali-G5") == true -> {
PerformanceProfile.MID_RANGE
}
// 低端GPU
else -> PerformanceProfile.LOW_END
}
}
完成度
✅ 100% - 所有功能都已实现并添加详细注释
- GPU供应商信息 ✅
- GPU型号信息 ✅
- Vulkan支持检测 ✅
- Vulkan API版本 ✅
- Vulkan驱动版本 ✅
- OpenGL ES版本 ✅
- OpenGL ES扩展 ✅
- EGL版本 ✅
- EGL扩展 ✅
- EGL客户端API ✅
- GPU设备类型 ✅
- 完整的中文注释 ✅
- 格式化信息输出 ✅