Android 动态性能框架 (ADPF)

news2024/9/20 20:26:23

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

给Ubuntu添加硬盘之后,该如何使用

当你给Ubuntu系统添加了新的硬盘后&#xff0c;你需要按照以下步骤来识别、分区、格式化和挂载新硬盘&#xff1a; 1. 检查新硬盘是否被系统识别 首先确认新硬盘已经被系统识别&#xff1a; lsblk 2. 分区新硬盘 如果硬盘没有分区或者需要重新分区&#xff0c;可以使用fdis…

Open3D mesh 获取网格属性

目录 一、概述 二、网格属性 三、实现代码 四、实现效果 4.1原始mesh 4.2数据显示 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 在 Open3D 中&#xff0c;网格模…

kubectl陈述式资源管理方式、声明式资源管理

一、命令行: kubectl命令行工具 优点: 90%以上的场景都可以满足 对资源的增&#xff0c;删&#xff0c;查比较方便&#xff0c;对改不是很友好 缺点:命令比较冗长&#xff0c;复杂难记 声明方式&#xff1a;k8s当中的yaml文件实现资源管理----声明式 GUI:图形化工具的管理…

谷歌又出三款Gemini模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

uniapp、微信小程序车牌的录入的解决方案

结合uv-ui进行编写&#xff0c;键盘使用uv-ui的组件&#xff0c;其他由我们自己编写。 <template><div class"addCarContent"><div class"boxContent"><div class"carCodeInput" click"getIndex"><div:cl…

中间件实时监控,运维难题一站解决

中间件是介于操作系统和在其上运行的应用程序之间的软件&#xff0c;实现了分布式应用程序的通信和数据管理&#xff0c;用于协调不同的系统和组件之间的通信&#xff0c;是连接应用与底层资源之间的桥梁。因此&#xff0c;中间件的稳定与高可用对于整个业务系统的可靠性和性能…

算法题:单词接龙

单词接龙 字典 wordList 中从单词 beginWord 到 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&#xff0c;每个 si 都在 wordList 中。注意&#xf…

倒计时1天!每日一题,零基础入门FPGA

近年来&#xff0c;FPGA工程师凭借着远高于传统软件开发工程师的薪酬&#xff0c;吸引了越来越多的人转行。 然而&#xff0c;入门FPGA并非易事。你需要有清晰的学习路线&#xff0c;包括它的基本组成&#xff08;如可编程逻辑块CLB、输入输出块IOB、内部连线资源等&#xff0…

【单片机开发】单片机的烧录方式详解(ICP、IAP、ISP)

【前言】 在单片机开发过程中&#xff0c;程序的烧录是一个至关重要的环节。随着技术的不断演进&#xff0c;单片机烧录方式也日益多样化。本文将重点讲解单片机中三种常见的烧录方式&#xff1a;ICP&#xff08;In-Circuit Programming&#xff09;、ISP&#xff08;In-Syste…

html+css+js网页设计 婚庆类型模版 12个页面

htmlcssjs网页设计 婚庆类型模版 12个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&am…

【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;算法 目录​​​​​​​ 前言 一、三路快排的整体思路 二、三路快排的具体实现 1.测试数据、交换函数和三数取中法 2.三路快排函数 三、程序全部代码 总…

vue手机端 搜索框调起带搜索键盘,点击确认自动关闭

效果如下图 步骤&#xff1a; 1.html,所需配置参数都在下图 <el-form :inline"true" :mode"serchFormf" class"searchForm" action"javascript:return true;"><el-form-item label"" ><el-inputsize"…

Oracle DG备库应用延迟问题分析处理

1.情况说明 分享一个之前的案例&#xff0c;客户备库出现间歇性的日志应用延迟&#xff0c;延迟最高时刻需经过约50分钟左右才能将日志追平。 2.详细记录 2.1、问题发现 数据库的DG1备库出现间歇性的日志应用延迟&#xff0c;具体表现为备库apply lag延迟过高。影响到数据库的…

基于Atlas200DK部署yolov5(v6.0)

Atlas200_YOLOv5_DVPP_AIPP 在Atlas200DK平台上基于DVPP和AIPP实现部署YOLOv5&#xff08;v6.0&#xff09; DVPP解码JPG&#xff0c;并Resize AIPP实现颜色转换&#xff1a;YUV420sp_U8 to RGB 效果&#xff1a; 前处理推理后处理5.21ms1.09ms4.41ms 环境&#xff1a;…

【hot100篇-python刷题记录】【多数元素】

R6-技巧篇 直接哈希表计数得了 查找最大&#xff0c;可以不用一次遍历&#xff0c;直接sort排序哈希表&#xff08;按值排列&#xff09;也可以 class Solution:def majorityElement(self, nums: List[int]) -> int:nlen(nums)tn//2dictdefaultdict(int)for num in nums:d…

C语言练习题2

1.基本运算符 /*基本运算符*/ #include<stdio.h> int main() {int a 10;int b 20;printf("%d %d %d %d", a b, a - b, a * b, a / b); }加减乘除是语言当中最基本的运算符。因为除法中都是整数&#xff0c;所以除法的结果只保留整数。要想获取小数部分除法…

IntelliJ IDEA修改默认.m2和.gradle缓存路径

IntelliJ IDEA修改默认.m2和.gradle缓存路径 在idea.exe安装路径下&#xff0c;找到\bin\idea.properties文件&#xff0c;打开&#xff0c;在后面追加两行&#xff08;如果没有&#xff09;&#xff1a; gradle.user.homeD:/program/gradle新位置maven_repositoryD:/program/m…

微服务框架一

微服务 配置描述 没有配置中心 建立配置中心后 配置中心在微服务的地位 主流配置中心对比 安装Nacos open API配置管理测试 配置外部mysql连接 Nacos每层含义 命名空间

从零开始掌握Vue实例

从零开始掌握Vue实例&#xff1a;深入理解数据绑定与生命周期的核心秘诀 引言 简要介绍主题&#xff1a; 在学习Vue.js的过程中&#xff0c;Vue实例是最基础也是最关键的部分。Vue实例是Vue应用的核心&#xff0c;它是数据、DOM元素和Vue组件之间的桥梁。掌握Vue实例的使用对于…

基于 ASP.NET的教材管理信息系统的设计与实现(最新定制开发,阿龙原创设计)✅

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…