525 lines
14 KiB
Markdown
525 lines
14 KiB
Markdown
# GpuInfo 使用示例
|
||
|
||
## 概述
|
||
GpuInfo类提供了获取设备GPU(图形处理器)详细信息的功能,包括Vulkan和OpenGL ES的硬件信息,如供应商、型号、显存、API版本、扩展等。
|
||
|
||
## 主要功能
|
||
1. 获取GPU供应商(AMD、ARM、Qualcomm、Mali等)
|
||
2. 获取GPU型号(Adreno 650、Mali-G78等)
|
||
3. Vulkan API支持检测和版本信息
|
||
4. OpenGL ES版本和扩展信息
|
||
5. EGL版本和扩展信息
|
||
6. GPU设备类型(集成显卡、独立显卡等)
|
||
7. 驱动版本信息
|
||
|
||
## 使用方法
|
||
|
||
### 1. 初始化AndInfo
|
||
```kotlin
|
||
import com.xyzshell.andinfo.AndInfo
|
||
|
||
// 在Application或Activity中初始化
|
||
AndInfo.init(applicationContext)
|
||
```
|
||
|
||
### 2. 获取GpuInfo实例
|
||
```kotlin
|
||
val gpuInfo = AndInfo.instance.gpu
|
||
```
|
||
|
||
### 3. 获取GPU基本信息
|
||
|
||
#### 供应商信息
|
||
```kotlin
|
||
// 获取GPU供应商名称
|
||
val vendorName = gpuInfo.getVendorName()
|
||
println("GPU供应商: $vendorName")
|
||
// 输出示例: "GPU供应商: Qualcomm" 或 "GPU供应商: ARM"
|
||
```
|
||
|
||
#### GPU型号
|
||
```kotlin
|
||
// 获取GPU型号/渲染器名称
|
||
val rendererName = gpuInfo.getRendererName()
|
||
println("GPU型号: $rendererName")
|
||
// 输出示例: "GPU型号: Adreno (TM) 650" 或 "GPU型号: Mali-G78"
|
||
```
|
||
|
||
#### 设备类型
|
||
```kotlin
|
||
// 获取GPU设备类型
|
||
val deviceType = gpuInfo.getDeviceType()
|
||
val deviceTypeDesc = gpuInfo.getDeviceTypeDescription()
|
||
println("设备类型: $deviceTypeDesc")
|
||
// 输出示例: "设备类型: 集成显卡"
|
||
```
|
||
|
||
### 4. Vulkan 信息
|
||
|
||
#### Vulkan支持检测
|
||
```kotlin
|
||
// 检查是否支持Vulkan API
|
||
val isVulkanSupported = gpuInfo.isVulkanSupported()
|
||
println("Vulkan支持: ${if (isVulkanSupported) "是" else "否"}")
|
||
```
|
||
|
||
#### Vulkan API版本
|
||
```kotlin
|
||
// 获取Vulkan API版本
|
||
val vulkanApiVersion = gpuInfo.getVulkanApiVersion()
|
||
vulkanApiVersion?.let { version ->
|
||
println("Vulkan API版本: $version")
|
||
// 输出示例: "Vulkan API版本: 1.3.0"
|
||
}
|
||
```
|
||
|
||
#### Vulkan驱动版本
|
||
```kotlin
|
||
// 获取Vulkan驱动版本
|
||
val driverVersion = gpuInfo.getVulkanDriverVersion()
|
||
driverVersion?.let { version ->
|
||
println("Vulkan驱动版本: $version")
|
||
// 输出示例: "Vulkan驱动版本: 512459776"
|
||
}
|
||
```
|
||
|
||
### 5. OpenGL ES 信息
|
||
|
||
#### OpenGL ES版本
|
||
```kotlin
|
||
// 获取OpenGL ES版本
|
||
val openglVersion = gpuInfo.getOpenGLVersion()
|
||
openglVersion?.let { version ->
|
||
println("OpenGL ES版本: $version")
|
||
// 输出示例: "OpenGL ES版本: OpenGL ES 3.2 V@0490.0"
|
||
}
|
||
```
|
||
|
||
#### OpenGL ES扩展
|
||
```kotlin
|
||
// 获取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版本
|
||
```kotlin
|
||
// 获取EGL版本
|
||
val eglVersion = gpuInfo.getEglVersion()
|
||
eglVersion?.let { version ->
|
||
println("EGL版本: $version")
|
||
// 输出示例: "EGL版本: 1.5"
|
||
}
|
||
```
|
||
|
||
#### EGL扩展
|
||
```kotlin
|
||
// 获取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
|
||
```kotlin
|
||
// 获取EGL支持的客户端API
|
||
val clientApis = gpuInfo.getEglClientApis()
|
||
clientApis?.let { apis ->
|
||
println("EGL客户端API: ${apis.joinToString(", ")}")
|
||
// 输出示例: "EGL客户端API: OpenGL_ES"
|
||
}
|
||
```
|
||
|
||
### 7. 获取完整GPU信息
|
||
|
||
#### 获取原始数据
|
||
```kotlin
|
||
// 获取完整的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")
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 获取格式化摘要
|
||
```kotlin
|
||
// 获取格式化的GPU信息摘要
|
||
val gpuSummary = gpuInfo.getGpuSummary()
|
||
println(gpuSummary)
|
||
```
|
||
|
||
### 8. 在Android UI中显示GPU信息
|
||
```kotlin
|
||
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
|
||
```kotlin
|
||
data class GpuInformationData(
|
||
val vkPhysicalDevices: List<VkPhysicalDevice>?, // Vulkan物理设备列表
|
||
val eglInformation: EglInformation? // EGL信息
|
||
)
|
||
```
|
||
|
||
### VkPhysicalDevice (Vulkan物理设备)
|
||
```kotlin
|
||
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信息)
|
||
```kotlin
|
||
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信息)
|
||
```kotlin
|
||
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
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. **本地库依赖**: GpuInfo需要加载本地库"andinfo",确保NDK部分正确编译
|
||
2. **Vulkan支持**: 不是所有设备都支持Vulkan API,需要先检查`isVulkanSupported()`
|
||
3. **设备差异**: 不同设备返回的GPU信息格式可能略有不同
|
||
4. **权限**: 获取GPU信息通常不需要特殊权限
|
||
5. **性能**: GPU信息获取涉及native调用,建议在后台线程执行
|
||
6. **扩展列表**: OpenGL扩展字符串可能非常长(数千字符),显示时需要适当处理
|
||
|
||
## 典型应用场景
|
||
|
||
### 1. 游戏兼容性检查
|
||
```kotlin
|
||
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选择
|
||
```kotlin
|
||
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. 性能分析和优化建议
|
||
```kotlin
|
||
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设备类型 ✅
|
||
- 完整的中文注释 ✅
|
||
- 格式化信息输出 ✅
|
||
|