473 lines
13 KiB
Markdown
473 lines
13 KiB
Markdown
# GpuInfo 增强功能使用示例
|
||
|
||
## 新增功能说明
|
||
|
||
`GpuInfo` 类已增强并修复以下功能:
|
||
- 修复了 `getOpenGLVersion()` 可能返回空值的问题
|
||
- 新增 GPU 最大频率获取
|
||
- 新增 GPU 架构信息
|
||
- 新增 GPU 缓存大小
|
||
- 新增 GPU 内存带宽
|
||
- 新增计算单元和着色单元数量
|
||
- 所有返回文本已国际化为英文
|
||
|
||
## 核心数据类
|
||
|
||
### GpuDetailedInfo
|
||
```kotlin
|
||
data class GpuDetailedInfo(
|
||
val maxFrequency: Int?, // 最大频率(MHz)
|
||
val architecture: String?, // 架构名称
|
||
val cacheSize: Int?, // 缓存大小(KB)
|
||
val bandwidth: Double?, // 内存带宽(GB/s)
|
||
val computeUnits: Int?, // 计算单元数量
|
||
val shadingUnits: Int? // 着色单元数量
|
||
)
|
||
```
|
||
|
||
## 支持的 GPU 型号
|
||
|
||
### Qualcomm Adreno 系列
|
||
- Adreno 740, 730, 725, 720, 710, 702
|
||
- Adreno 690, 660, 650, 640, 630, 620
|
||
|
||
### ARM Mali 系列
|
||
- Mali-G720, G715, G710, G610
|
||
- Mali-G78, G77, G76, G72, G71
|
||
- Mali-G68, G57, G52, G51
|
||
|
||
### Apple GPU
|
||
- A17/M3, A16/M2, A15/M1
|
||
|
||
### PowerVR 系列
|
||
- PowerVR GE8320
|
||
|
||
## 使用示例
|
||
|
||
### 1. 获取基本 GPU 信息
|
||
|
||
```kotlin
|
||
val gpuInfo = GpuInfo(context)
|
||
|
||
// 获取供应商
|
||
val vendor = gpuInfo.getVendorName()
|
||
println("GPU Vendor: $vendor")
|
||
|
||
// 获取型号
|
||
val renderer = gpuInfo.getRendererName()
|
||
println("GPU Model: $renderer")
|
||
|
||
// 获取设备类型
|
||
val deviceType = gpuInfo.getDeviceTypeDescription()
|
||
println("Device Type: $deviceType")
|
||
|
||
// 获取 OpenGL ES 版本(已修复)
|
||
val glVersion = gpuInfo.getOpenGLVersion()
|
||
println("OpenGL ES Version: $glVersion")
|
||
|
||
// 获取 Vulkan 版本
|
||
val vkVersion = gpuInfo.getVulkanApiVersion()
|
||
println("Vulkan Version: $vkVersion")
|
||
```
|
||
|
||
### 2. 获取 GPU 详细规格
|
||
|
||
```kotlin
|
||
val gpuInfo = GpuInfo(context)
|
||
|
||
// 获取完整的 GPU 详细信息
|
||
val detailedInfo = gpuInfo.getGpuDetailedInfo()
|
||
|
||
println("=== GPU Specifications ===")
|
||
println("Architecture: ${detailedInfo.architecture}")
|
||
println("Max Frequency: ${detailedInfo.maxFrequency} MHz")
|
||
println("Cache Size: ${detailedInfo.cacheSize} KB")
|
||
println("Memory Bandwidth: ${detailedInfo.bandwidth} GB/s")
|
||
println("Compute Units: ${detailedInfo.computeUnits}")
|
||
println("Shading Units: ${detailedInfo.shadingUnits}")
|
||
```
|
||
|
||
### 3. 获取单个规格属性
|
||
|
||
```kotlin
|
||
val gpuInfo = GpuInfo(context)
|
||
|
||
// 获取最大频率
|
||
val maxFreq = gpuInfo.getMaxFrequency()
|
||
println("Max Frequency: ${maxFreq ?: "Unknown"} MHz")
|
||
|
||
// 获取架构
|
||
val arch = gpuInfo.getArchitecture()
|
||
println("Architecture: ${arch ?: "Unknown"}")
|
||
|
||
// 获取缓存大小
|
||
val cache = gpuInfo.getCacheSize()
|
||
println("Cache: ${cache ?: "Unknown"} KB")
|
||
|
||
// 获取带宽
|
||
val bandwidth = gpuInfo.getBandwidth()
|
||
println("Bandwidth: ${bandwidth ?: "Unknown"} GB/s")
|
||
|
||
// 获取计算单元
|
||
val computeUnits = gpuInfo.getComputeUnits()
|
||
println("Compute Units: ${computeUnits ?: "Unknown"}")
|
||
|
||
// 获取着色单元
|
||
val shadingUnits = gpuInfo.getShadingUnits()
|
||
println("Shading Units: ${shadingUnits ?: "Unknown"}")
|
||
```
|
||
|
||
### 4. 获取完整的 GPU 摘要
|
||
|
||
```kotlin
|
||
val gpuInfo = GpuInfo(context)
|
||
|
||
// 获取格式化的完整摘要
|
||
val summary = gpuInfo.getGpuSummary()
|
||
println(summary)
|
||
```
|
||
|
||
输出示例:
|
||
```
|
||
=== GPU Basic Info ===
|
||
Vendor: Qualcomm
|
||
Model: Adreno (TM) 730
|
||
Type: Integrated GPU
|
||
|
||
=== GPU Specifications ===
|
||
Architecture: Adreno 730
|
||
Max Frequency: 818 MHz
|
||
Cache Size: 1536 KB
|
||
Memory Bandwidth: 44.8 GB/s
|
||
Compute Units: 6
|
||
Shading Units: 768
|
||
|
||
=== Vulkan Info ===
|
||
Supported: Yes
|
||
API Version: 1.3.0
|
||
Driver Version: 512
|
||
|
||
--- Vulkan Device ---
|
||
Device Name: Adreno (TM) 730
|
||
Device ID: 43051011
|
||
Vendor ID: 0x5143
|
||
Registered Vendor: Qualcomm
|
||
Device Type: Integrated GPU
|
||
API Version: 1.3.0
|
||
|
||
=== OpenGL ES Info ===
|
||
Vendor: Qualcomm
|
||
Renderer: Adreno (TM) 730
|
||
Version: OpenGL ES 3.2
|
||
Extension Count: 247
|
||
|
||
=== EGL Info ===
|
||
Vendor: Qualcomm
|
||
Version: 1.5
|
||
Client API: OpenGL_ES
|
||
Extension Count: 52
|
||
```
|
||
|
||
### 5. 计算 GPU 性能指标
|
||
|
||
```kotlin
|
||
val gpuInfo = GpuInfo(context)
|
||
val detailedInfo = gpuInfo.getGpuDetailedInfo()
|
||
|
||
// 计算理论峰值性能(GFLOPS)
|
||
// 公式:着色单元 * 频率 * 2 (FMA operations)
|
||
val theoreticalGFLOPS = detailedInfo.shadingUnits?.let { units ->
|
||
detailedInfo.maxFrequency?.let { freq ->
|
||
(units * freq * 2) / 1000.0
|
||
}
|
||
}
|
||
|
||
println("Theoretical Peak Performance: ${theoreticalGFLOPS?.let {
|
||
String.format("%.1f GFLOPS", it)
|
||
} ?: "Unknown"}")
|
||
|
||
// 计算带宽利用率(假设某个应用需要 10 GB/s)
|
||
val requiredBandwidth = 10.0
|
||
val bandwidthUtilization = detailedInfo.bandwidth?.let {
|
||
(requiredBandwidth / it * 100).coerceIn(0.0, 100.0)
|
||
}
|
||
|
||
println("Bandwidth Utilization: ${bandwidthUtilization?.let {
|
||
String.format("%.1f%%", it)
|
||
} ?: "Unknown"}")
|
||
```
|
||
|
||
### 6. 比较不同 GPU
|
||
|
||
```kotlin
|
||
fun compareGpus(gpu1Name: String, gpu2Name: String) {
|
||
val gpuInfo = GpuInfo(context)
|
||
|
||
// 模拟获取两个 GPU 的信息(实际使用中,这些可能来自数据库)
|
||
val spec1 = gpuInfo.getGpuSpecsByRenderer(gpu1Name.lowercase())
|
||
val spec2 = gpuInfo.getGpuSpecsByRenderer(gpu2Name.lowercase())
|
||
|
||
println("=== GPU Comparison ===")
|
||
println("GPU 1: $gpu1Name")
|
||
println(" Max Freq: ${spec1.maxFrequency} MHz")
|
||
println(" Bandwidth: ${spec1.bandwidth} GB/s")
|
||
println(" Compute Units: ${spec1.computeUnits}")
|
||
|
||
println("\nGPU 2: $gpu2Name")
|
||
println(" Max Freq: ${spec2.maxFrequency} MHz")
|
||
println(" Bandwidth: ${spec2.bandwidth} GB/s")
|
||
println(" Compute Units: ${spec2.computeUnits}")
|
||
|
||
// 简单性能比较
|
||
val perfScore1 = (spec1.maxFrequency ?: 0) * (spec1.computeUnits ?: 0)
|
||
val perfScore2 = (spec2.maxFrequency ?: 0) * (spec2.computeUnits ?: 0)
|
||
|
||
println("\nPerformance Score:")
|
||
println(" $gpu1Name: $perfScore1")
|
||
println(" $gpu2Name: $perfScore2")
|
||
|
||
if (perfScore1 > perfScore2) {
|
||
val diff = ((perfScore1 - perfScore2).toDouble() / perfScore2 * 100)
|
||
println(" $gpu1Name is ${String.format("%.1f%%", diff)} faster")
|
||
} else if (perfScore2 > perfScore1) {
|
||
val diff = ((perfScore2 - perfScore1).toDouble() / perfScore1 * 100)
|
||
println(" $gpu2Name is ${String.format("%.1f%%", diff)} faster")
|
||
}
|
||
}
|
||
|
||
// 使用示例
|
||
compareGpus("Adreno 730", "Mali-G78")
|
||
```
|
||
|
||
### 7. 在 Jetpack Compose 中显示
|
||
|
||
```kotlin
|
||
@Composable
|
||
fun GpuInfoCard() {
|
||
val context = LocalContext.current
|
||
val gpuInfo = remember { GpuInfo(context) }
|
||
val detailedInfo = remember { gpuInfo.getGpuDetailedInfo() }
|
||
|
||
Card(
|
||
modifier = Modifier
|
||
.fillMaxWidth()
|
||
.padding(16.dp),
|
||
elevation = CardDefaults.cardElevation(4.dp)
|
||
) {
|
||
Column(modifier = Modifier.padding(16.dp)) {
|
||
Text(
|
||
text = "GPU Information",
|
||
style = MaterialTheme.typography.titleLarge,
|
||
fontWeight = FontWeight.Bold
|
||
)
|
||
|
||
Spacer(modifier = Modifier.height(16.dp))
|
||
|
||
// 基本信息
|
||
InfoRow("Vendor", gpuInfo.getVendorName() ?: "Unknown")
|
||
InfoRow("Model", gpuInfo.getRendererName() ?: "Unknown")
|
||
InfoRow("Type", gpuInfo.getDeviceTypeDescription() ?: "Unknown")
|
||
|
||
Divider(modifier = Modifier.padding(vertical = 8.dp))
|
||
|
||
// 详细规格
|
||
Text(
|
||
text = "Specifications",
|
||
style = MaterialTheme.typography.titleMedium,
|
||
fontWeight = FontWeight.Bold
|
||
)
|
||
|
||
Spacer(modifier = Modifier.height(8.dp))
|
||
|
||
detailedInfo.architecture?.let {
|
||
InfoRow("Architecture", it)
|
||
}
|
||
detailedInfo.maxFrequency?.let {
|
||
InfoRow("Max Frequency", "$it MHz")
|
||
}
|
||
detailedInfo.cacheSize?.let {
|
||
InfoRow("Cache Size", "$it KB")
|
||
}
|
||
detailedInfo.bandwidth?.let {
|
||
InfoRow("Bandwidth", String.format("%.1f GB/s", it))
|
||
}
|
||
detailedInfo.computeUnits?.let {
|
||
InfoRow("Compute Units", it.toString())
|
||
}
|
||
detailedInfo.shadingUnits?.let {
|
||
InfoRow("Shading Units", it.toString())
|
||
}
|
||
|
||
Divider(modifier = Modifier.padding(vertical = 8.dp))
|
||
|
||
// API 信息
|
||
Text(
|
||
text = "API Support",
|
||
style = MaterialTheme.typography.titleMedium,
|
||
fontWeight = FontWeight.Bold
|
||
)
|
||
|
||
Spacer(modifier = Modifier.height(8.dp))
|
||
|
||
InfoRow("OpenGL ES", gpuInfo.getOpenGLVersion() ?: "Unknown")
|
||
InfoRow("Vulkan", gpuInfo.getVulkanApiVersion() ?: "Not Supported")
|
||
InfoRow("EGL", gpuInfo.getEglVersion() ?: "Unknown")
|
||
}
|
||
}
|
||
}
|
||
|
||
@Composable
|
||
fun InfoRow(label: String, value: String) {
|
||
Row(
|
||
modifier = Modifier
|
||
.fillMaxWidth()
|
||
.padding(vertical = 4.dp),
|
||
horizontalArrangement = Arrangement.SpaceBetween
|
||
) {
|
||
Text(
|
||
text = label,
|
||
style = MaterialTheme.typography.bodyMedium,
|
||
color = MaterialTheme.colorScheme.onSurfaceVariant
|
||
)
|
||
Text(
|
||
text = value,
|
||
style = MaterialTheme.typography.bodyMedium,
|
||
fontWeight = FontWeight.Medium
|
||
)
|
||
}
|
||
}
|
||
```
|
||
|
||
### 8. 检测 GPU 能力
|
||
|
||
```kotlin
|
||
fun checkGpuCapabilities(context: Context) {
|
||
val gpuInfo = GpuInfo(context)
|
||
val detailedInfo = gpuInfo.getGpuDetailedInfo()
|
||
|
||
println("=== GPU Capabilities Check ===")
|
||
|
||
// 检查是否适合游戏
|
||
val isGoodForGaming = (detailedInfo.maxFrequency ?: 0) > 600 &&
|
||
(detailedInfo.computeUnits ?: 0) >= 4 &&
|
||
(detailedInfo.bandwidth ?: 0.0) > 25.0
|
||
|
||
println("Suitable for Gaming: ${if (isGoodForGaming) "Yes" else "No"}")
|
||
|
||
// 检查是否支持高端图形
|
||
val supportsHighEndGraphics = gpuInfo.isVulkanSupported() &&
|
||
(detailedInfo.shadingUnits ?: 0) > 512
|
||
|
||
println("High-End Graphics Support: ${if (supportsHighEndGraphics) "Yes" else "No"}")
|
||
|
||
// 检查 AI/ML 能力
|
||
val goodForAI = (detailedInfo.computeUnits ?: 0) >= 6 &&
|
||
(detailedInfo.bandwidth ?: 0.0) > 40.0
|
||
|
||
println("Good for AI/ML: ${if (goodForAI) "Yes" else "No"}")
|
||
|
||
// 推荐图形质量设置
|
||
val recommendedQuality = when {
|
||
(detailedInfo.maxFrequency ?: 0) > 800 &&
|
||
(detailedInfo.computeUnits ?: 0) >= 6 -> "Ultra"
|
||
(detailedInfo.maxFrequency ?: 0) > 650 &&
|
||
(detailedInfo.computeUnits ?: 0) >= 4 -> "High"
|
||
(detailedInfo.maxFrequency ?: 0) > 500 -> "Medium"
|
||
else -> "Low"
|
||
}
|
||
|
||
println("Recommended Graphics Quality: $recommendedQuality")
|
||
}
|
||
```
|
||
|
||
### 9. OpenGL ES 版本检测增强
|
||
|
||
```kotlin
|
||
val gpuInfo = GpuInfo(context)
|
||
|
||
// 修复后的 getOpenGLVersion() 方法
|
||
val glVersion = gpuInfo.getOpenGLVersion()
|
||
|
||
when {
|
||
glVersion == null || glVersion == "Unknown" -> {
|
||
println("OpenGL ES: Not available or unknown")
|
||
}
|
||
glVersion.contains("3.2") -> {
|
||
println("OpenGL ES 3.2: Full support for modern graphics")
|
||
}
|
||
glVersion.contains("3.1") -> {
|
||
println("OpenGL ES 3.1: Good support for most features")
|
||
}
|
||
glVersion.contains("3.0") -> {
|
||
println("OpenGL ES 3.0: Basic modern graphics support")
|
||
}
|
||
glVersion.contains("2.0") -> {
|
||
println("OpenGL ES 2.0: Legacy support only")
|
||
}
|
||
else -> {
|
||
println("OpenGL ES: $glVersion")
|
||
}
|
||
}
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. **规格数据来源**: GPU 规格信息基于公开的硬件数据库,对于未识别的 GPU 型号,规格字段将返回 `null`
|
||
|
||
2. **OpenGL ES 版本修复**:
|
||
- 修复了可能返回 `null` 的问题
|
||
- 如果无法从 EGL 获取,会尝试从 Vulkan 推断
|
||
- 最坏情况返回 "Unknown" 而不是 `null`
|
||
|
||
3. **精确性**:
|
||
- 频率和带宽值是理论最大值,实际运行时可能更低
|
||
- 不同设备批次可能有轻微差异
|
||
|
||
4. **权限**: 获取 GPU 信息不需要特殊权限
|
||
|
||
5. **性能**:
|
||
- GPU 信息获取是轻量级操作
|
||
- 建议在应用启动时获取一次并缓存
|
||
|
||
6. **兼容性**:
|
||
- 支持 Android 5.0 (API 21) 及以上
|
||
- Vulkan 信息需要 Android 7.0 (API 24) 及以上
|
||
|
||
7. **国际化**: 所有返回的文本信息已改为英文,中文保留在注释中
|
||
|
||
## 已修复的问题
|
||
|
||
### getOpenGLVersion() 返回 null
|
||
**问题**: 在某些设备上,`getOpenGLVersion()` 可能返回 `null`
|
||
|
||
**原因**: EGL 上下文创建失败或 GL 字符串查询失败
|
||
|
||
**解决方案**:
|
||
1. 添加了回退机制:从 Vulkan 版本推断 OpenGL ES 支持
|
||
2. 确保总是返回非 null 值(至少返回 "Unknown")
|
||
3. 增加了错误处理
|
||
|
||
## 扩展建议
|
||
|
||
如果需要添加更多 GPU 型号的支持,可以在 `getGpuSpecsByRenderer()` 方法中添加新的匹配规则:
|
||
|
||
```kotlin
|
||
"your_gpu_name" in renderer -> GpuDetailedInfo(
|
||
maxFrequency = 850, // MHz
|
||
architecture = "Architecture Name",
|
||
cacheSize = 1024, // KB
|
||
bandwidth = 38.4, // GB/s
|
||
computeUnits = 5,
|
||
shadingUnits = 640
|
||
)
|
||
```
|
||
|
||
## 性能分级参考
|
||
|
||
根据获取的 GPU 信息,可以进行性能分级:
|
||
|
||
- **旗舰级**: 频率 > 800 MHz, 带宽 > 45 GB/s, 计算单元 >= 6
|
||
- **高端**: 频率 > 650 MHz, 带宽 > 35 GB/s, 计算单元 >= 4
|
||
- **中端**: 频率 > 500 MHz, 带宽 > 20 GB/s, 计算单元 >= 3
|
||
- **入门级**: 其他
|