简介
本教程将指导你如何使用 Android 动态性能框架 (ADPF) 来优化 Android 设备上的游戏散热和 CPU 性能。通过 ADPF,开发者能够更有效地与设备的电源和散热系统交互,以在不引发过热问题的情况下,最大限度地提升游戏性能。
使用场景
对于性能要求较高的游戏和应用,开发者面临着在保证用户体验的同时,充分发挥设备性能的挑战。ADPF 提供了必要的信息和控制能力,帮助开发者优化应用性能,特别是在移动设备 SoC 和 Android 系统的动态性能行为方面。
以下是主要的 ADPF 功能
1、Thermal API
- 作用: 监控设备的热状态,允许应用在工作负载过高导致设备过热之前主动调整其行为。
- 用法:
- 通过
PowerManager
获取ThermalStatus
对象。 - 使用
ThermalStatus
的方法获取当前温度、温度状态和严重程度等信息。 - 注册
ThermalEventListener
监听温度状态的变化。
- 通过
2、CPU Performance Hint API
- 作用: 向系统提供性能提示,例如 CPU 核心需求和期望的 CPU 频率,以便系统为当前工作负载选择合适的性能设置。
- 用法:
- 创建
PerformanceHintManager
实例。 - 使用
createHintSession()
创建一个性能提示会话。 - 在会话中,调用
setHint()
方法设置性能提示,例如CPU_CLUSTER_BIG
或CPU_FREQUENCY_HIGH
。 - 完成后,调用
close()
关闭会话。
- 创建
3、Game Mode API 和 Game State API
- 作用: 根据用户的设置和游戏特定的配置,通过确定性能或电池续航时间的优先级来启用游戏优化功能。
- 用法:
- 使用
GameModeManager
管理游戏模式。 - 通过
getGameMode()
获取当前游戏模式。 - 使用
setGameState()
设置当前游戏状态,例如GAME_RUNNING
或GAME_LOADING
。 - 系统会根据游戏模式和游戏状态自动调整性能和功耗。
- 使用
4、固定性能模式
- 作用: 在进行基准测试期间在设备上启用固定性能模式,以获取不会因动态 CPU 时钟设置而更改的测量结果。
- 用法: 需要 root 权限或特殊的系统应用权限才能启用。
5、节能模式 (Android 15 及以上)
- 作用: 告知系统在性能提示会话中可以安全地安排线程,使其优先考虑节能而非性能。
- 用法: 在创建性能提示会话时,调用
setPreferPowerEfficiency(true)
。
示例代码
以下是结合上述功能的示例代码,展示如何使用 ADPF API 来优化应用性能。
Thermal API 示例
import android.content.Context
import android.os.Bundle
import android.os.PowerManager
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.util.concurrent.Executors
class MainActivity : AppCompatActivity() {
private lateinit var thermalStatusTextView: TextView
private lateinit var executor: java.util.concurrent.Executor
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
thermalStatusTextView = findViewById(R.id.thermal_status_text)
executor = Executors.newSingleThreadExecutor()
// 获取 PowerManager 实例
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
// 获取当前温度状态
val thermalStatus = powerManager.currentThermalStatus
// 显示初始温度状态
updateThermalStatusText(thermalStatus)
// 注册温度状态监听器
thermalStatus.addListener(executor) { newStatus ->
runOnUiThread {
updateThermalStatusText(newStatus)
reactToThermalStatus(newStatus)
}
}
}
private fun updateThermalStatusText(thermalStatus: PowerManager.ThermalStatus) {
val statusText = when (thermalStatus.status) {
PowerManager.ThermalStatus.THERMAL_STATUS_NONE -> "正常"
PowerManager.ThermalStatus.THERMAL_STATUS_LIGHT -> "轻微发热"
PowerManager.ThermalStatus.THERMAL_STATUS_MODERATE -> "中等发热"
PowerManager.ThermalStatus.THERMAL_STATUS_SEVERE -> "严重发热"
PowerManager.ThermalStatus.THERMAL_STATUS_CRITICAL -> "过热!"
else -> "未知状态"
}
thermalStatusTextView.text = "当前温度状态:$statusText"
}
private fun reactToThermalStatus(thermalStatus: PowerManager.ThermalStatus) {
// 根据温度状态调整应用行为
when (thermalStatus.status) {
PowerManager.ThermalStatus.THERMAL_STATUS_SEVERE,
PowerManager.ThermalStatus.THERMAL_STATUS_CRITICAL -> {
// 设备过热,采取紧急措施
// 例如:降低游戏帧率、停止后台任务、弹窗提示用户等
}
PowerManager.ThermalStatus.THERMAL_STATUS_MODERATE -> {
// 设备温度较高,适当降低功耗
// 例如:降低游戏画质、减少网络请求频率等
}
else -> {
// 设备温度正常,正常运行
}
}
}
}
CPU Performance Hint API 示例
import android.content.Context
import android.os.Bundle
import android.os.PerformanceHintManager
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 获取 PerformanceHintManager 实例
val performanceManager = getSystemService(Context.PERFORMANCE_HINT_MANAGER_SERVICE) as PerformanceHintManager
// 创建性能提示会话,指定场景为应用启动
val session = performanceManager.createHintSession(PerformanceHintManager.PERFORMANCE_HINT_APP_LAUNCH)
try {
// 设置性能提示,请求使用大核集群
session.setHint(PerformanceHintManager.PERFORMANCE_HINT_CPU_CLUSTER_BIG)
// 执行需要高性能的操作,例如加载资源、进行复杂计算等
performHighPerformanceTask()
} finally {
// 关闭会话,释放资源
session.close()
}
}
private fun performHighPerformanceTask() {
// 模拟执行高性能操作,例如:
var result = 0.0
for (i in 1..1000000) {
result += Math.sqrt(i.toDouble())
}
println("计算结果:$result")
}
}
Game Mode API 和 Game State API 示例
import android.content.Context
import android.os.Bundle
import android.os.PowerManager
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val gameModeManager = getSystemService(Context.GAME_MODE_SERVICE) as GameModeManager
val currentGameMode = gameModeManager.gameMode
gameModeManager.setGameState(GAME_RUNNING)
// 根据 currentGameMode 和 GAME_RUNNING 调整性能和功耗
}
}
节能模式示例
import android.content.Context
import android.os.Bundle
import android.os.PerformanceHintManager
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val performanceManager = getSystemService(Context.PERFORMANCE_HINT_MANAGER_SERVICE) as PerformanceHintManager
val session = performanceManager.createHintSession(PerformanceHintManager.PERFORMANCE_HINT_APP_LAUNCH).apply {
setPreferPowerEfficiency(true)
}
try {
// 在此会话中执行需要性能提示的任务,同时优先考虑节能
performTasks(session)
} finally {
session.close()
}
}
private fun performTasks(session: PerformanceHintManager.Session) {
session.setHint(PerformanceHintManager.PERFORMANCE_HINT_CPU_CLUSTER_BIG)
// 执行需要性能提示的操作,例如加载资源、进行复杂计算等
}
}