当前位置: 首页 > news >正文

Android 动态性能框架 (ADPF)

Performance Hint API  |  Android game development  |  Android Developers (google.cn)

ADPF 是一组 API,可让游戏和性能密集型应用更为直接地与 Android 设备的电源和散热系统进行互动。借助这些 API,您可以监控 Android 系统上的动态行为,在不造成设备过热问题的可持续界限内优化游戏性能。

与桌面设备和游戏机相比,移动 SoC Android 具有更多的动态性能行为。这些行为包括热状态管理、不同的 CPU 时钟和不同的 CPU 核心类型。再加上 SoC 核心拓扑日益多样化,这给尝试确保您的游戏能够利用这种行为而不对设备性能产生负面影响时带来了挑战。ADPF 提供其中一些信息是为了提高性能的可预测性。

以下是主要的 ADPF 功能:

  • Thermal API:监控设备的热状态,以便应用在工作负载变得不可持续之前主动调整工作负载。
  • 已发布
  • Android 11API 级别 30Thermal API
  • Android 12API 级别 31NDK API
  • (预览版)Android 15 (DP1) - getThermalHeadroomThresholds()
  • 应用的潜在性能受设备热状态的限制,热状态可能会因天气、近期使用情况以及设备热设计等特性而异。设备只能维持较高的 在一段有限的时间里确保性能,然后才会受到温控。实现的关键目标是在不超出热限制的情况下实现性能目标。Thermal API 让这一切无需您 进行设备特定的优化此外,在调试性能时 设备热状态是否会限制性能 非常重要。
  • 游戏引擎通常具有运行时性能参数,可以调整引擎对设备施加的工作负载。例如,这些参数可以设置 工作器线程数、大小核心的工作器线程亲和性、 GPU 保真度选项和帧缓冲区分辨率。在 Unity Engine 中,游戏 开发者可以通过更改 设置 使用 Adaptive Performance 插件 对于 Unreal Engine,请使用可伸缩性设置来调整 动态地调整质量级别。
  • 当设备接近不安全的热状态时,您的游戏可以通过借助这些参数降低工作负载来避免受到限制。为避免受到限制,您应监控设备的热状态并主动调整游戏引擎工作负载。一旦设备过热,工作负载必须 降至可持续的性能水平以下,以便散热。更新后 热余量降低到更安全的水平,游戏可以提高 但务必找到可持续的质量水平 以获得最佳游戏时间。
  • 您可以通过轮询 getThermalHeadroom 方法来监控设备的热状态。此方法可预测设备可以保持当前状态多长时间 性能水平不会过热如果时间低于运行工作负载所需的时间量,您的游戏应将工作负载降低到可持续水平。例如,游戏可以切换到较小的核心、降低帧速率或降低保真度。

  • CPU Performance Hint API:提供性能提示,让 Android 能够为工作负载选择合适的性能设置(例如 CPU 操作点或核心)。

已发布

Android 12API 级别 31Performance Hint API

Android 13API 级别 33NDK API 中的性能提示管理器

(预览版)Android 15 (DP1) - reportActualWorkDuration()

通过 CPU 性能提示,游戏可能会影响动态 CPU 性能 更好地满足其需求。在大多数设备上,Android 会动态调整 根据之前的需求确定工作负载的 CPU 时钟速度和核心类型。 如果工作负载使用的 CPU 资源较多,那么时钟速度会加快, 工作负载最终会移至更大的核心。如果工作负载使用 那么 Android 会减少资源分配。借助 ADPF,应用 或者游戏可以发送有关其性能和截止时间的额外信号。本次 有助于系统更积极地磨合(改善性能),并降低 在工作负载完成后迅速启动(节省电量)。

时钟速度

Android 设备动态调整其 CPU 时钟速度时,频率可以 更改代码的性能设计处理动态时钟的代码 速度对于最大限度地提高性能、保持安全 以及高效利用电力。您无法直接分配 CPU 频率 。因此,应用尝试以更高的性能运行的常见方式是 CPU 时钟速度是在后台线程中运行繁忙循环,因此工作负载 要求越来越高这是一种不良做法,因为它不仅浪费电量,还会增加 设备上的热负载(当应用实际上并未使用 资源。CPU PerformanceHint API 就旨在解决此问题。修改者 告知系统实际工作时长和目标工作时长, Android 将能够获取应用的 CPU 需求概览,并为应用分配 资源。这将有助于在高效能耗下实现最佳性能 消费水平。

核心类型

运行游戏的 CPU 核心类型是影响性能的另一项重要因素。Android 设备通常会根据近期的工作负载行为动态更改分配给线程的 CPU 核心。在具有多个核心类型的 SoC 上,CPU 核心分配会更加复杂。在某些此类设备上,较大的核心仅供短暂使用,而不会陷入热不可持续状态。

您的游戏不应出于以下原因尝试设置 CPU 核心亲和性:

  • 工作负载的最佳核心类型因设备型号而异。
  • 运行较大核心的可持续性因 SoC 和每个设备型号提供的不同散热解决方案而异。
  • 对热状态的环境影响可能使核心选择变得更加复杂。例如,天气或手机壳可能会改变设备的热状态。
  • 核心选择无法适应具有额外的性能和散热功能的新设备。因此,设备通常会忽略游戏的处理器亲和性。

默认 Linux 调度程序行为示例

图 1. 调节器可能需要大约 200 毫秒的时间来增加或降低 CPU 频率。ADPF 与动态电压和频率调节系统 (DVFS) 搭配使用,可实现最佳的单位能耗性能

PerformanceHint API 提取的不仅仅是 DVFS 延迟时间

图 2. ADPF 知道如何代表您做出最佳决定<ph type="x-smartling-placeholder">

</ph>

  • 如果任务需要在特定的 CPU 上运行,PerformanceHint API 知道如何 并代您做出决定。
  • 因此,您无需使用亲和性。
  • 设备附带各种拓扑;电源和散热特性 过于多样化,无法提供给应用开发者。
  • 您不能对运行应用的底层系统做出任何假设。

解决方案

ADPF 提供 PerformanceHintManager 类,以便游戏可以向 Android 发送性能提示,以了解 CPU 时钟速度和 核心类型。然后,操作系统可以根据设备的 SoC 和散热解决方案决定如何充分利用这些提示。如果您的应用将此 API 与热状态监控功能结合使用,则可以为操作系统提供更明智的提示,而无需使用忙循环和其他可能导致受限制的编码方法。

游戏使用性能提示的方式如下:

  1. 针对行为相似的关键线程创建提示会话。例如:
    • 呈现线程及其依赖项获取一个会话 <ph type="x-smartling-placeholder">

</ph>

      1. Cocos 中,主线程线程和渲染线程分别是 会话
      2. Unity 中,集成 Adaptive Performance Android Provider 插件
      3. Unreal 中,集成 Unreal Adaptive Performance 插件并使用 可扩缩性选项:支持多个质量级别
    1. IO 线程获得另一会话
    2. 音频会话获得第三个会话
  1. 游戏应尽早执行此操作,至少要比会话需要更多系统资源的时间提前 2 毫秒(最好超过 4 毫秒)。
  2. 在每个提示会话中,预测每个会话运行所需的时长。典型时长相当于帧间隔,但应用可以使用 则间隔会变短。

  • Game Mode API Game State API:根据用户的设置和游戏专用配置,通过确定性能或电池续航时间特征的优先级来启用游戏优化功能。
  • 固定性能模式:在进行基准测试期间在设备上启用固定性能模式,以获取不会因动态 CPU 时钟设置而更改的测量结果。
  • 节能模式:告知会话可以安全地安排性能提示会话中的线程,使其优先考虑节能而非性能。(适用于 Android 15

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • STM32F1+HAL库+FreeTOTS学习8——第一个任务,启动!
  • linux-基础知识2
  • 白盒测试及其测试方法
  • Linux高级编程-进程间通信(IPC)
  • 构建大师:深入理解Linux下的Make和Makefile
  • UE5学习笔记20-给游戏添加声音
  • 安装VC++Redist报错0x80070003的解决办法
  • 大连网站建设手机网页页面设计
  • STM32入门教程:SPI通信
  • RabbitMQ 集群与高可用性
  • 每日算法!!
  • 利用Spring Boot实现微服务的API版本管理
  • C语言 面向对象编程
  • Java项目中的分库分表实践指南
  • QNN:基于QNN+example重构之后的yolov8det部署
  • 【译】理解JavaScript:new 关键字
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Electron入门介绍
  • github指令
  • PHP CLI应用的调试原理
  • SegmentFault 2015 Top Rank
  • SQLServer之创建数据库快照
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 深入浅出Node.js
  • 通过几道题目学习二叉搜索树
  • 赢得Docker挑战最佳实践
  • 优化 Vue 项目编译文件大小
  • 原生 js 实现移动端 Touch 滑动反弹
  • 原生js练习题---第五课
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (4)logging(日志模块)
  • (libusb) usb口自动刷新
  • (Ruby)Ubuntu12.04安装Rails环境
  • (不用互三)AI绘画工具应该如何选择
  • (函数)颠倒字符串顺序(C语言)
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (剑指Offer)面试题34:丑数
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)SpringBoot3---尚硅谷总结
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .NET Core跨平台微服务学习资源
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接