Android Performance Tuner (APT) 与Memory Advice API_如何验证原生安卓的tuner是否好用-程序员宅基地

技术标签: Unity & Android  游戏引擎  android  性能优化  

//

Android 性能调整器 (APT)   Android 游戏开发工具包的一部分。

Android Performance Tuner (APT) 可帮助您在许多 Android 设备上大规模测量和优化帧速率、图形保真度、加载时间和加载放弃,从而为每位用户提供最佳体验。

它可以帮助您识别游戏或应用程序中的性能问题,并突出显示提高保真度的机会。影响指标可帮助您确定优先级,并对问题进行分类以帮助您采取行动。设备型号和设备规格级别的信息使您能够找到最有效的行动方式。


有什么好处?

Android Performance Tuner (APT) 可帮助您为更多用户提供高质量的体验。

新的!了解您的加载时间及其对放弃的影响

APT 在多种装载(首次装载、冷装载、暖装载和层间装载)中跟踪您的装载时间和装载放弃。它向您展示了较长的加载时间对您的游戏放弃的影响,以便您确定最佳加载时间。

衡量用户体验的质量

APT 向您展示您的游戏在现实世界中的实际用户设备上的帧速率和加载时间性能,以便您直接了解他们的体验。所有指标都是根据您的目标定制的,因此您可以了解游戏相对于您的特定目标的表现。

诊断并优先处理您的游戏性能问题

帧速率和加载时间问题由您的质量级别和游戏内注释以及设备型号细分,以帮助您缩小根本原因。对于每个帧速率问题,您可以查看 GPU 时间和 CPU 时间,因此您可以评估可能需要哪种类型的优化。还会显示受影响的会话数,以便您了解对用户影响最大的因素,并决定首先关注哪些设备或游戏场景。

充分利用每台设备

除了解决性能率问题外,APT 还强调了通过提高已经表现良好但仍有进一步发展空间的设备的保真度来改善用户体验的机会。这使您能够确保每个用户都能获得最佳的游戏体验。

它是如何工作的?

Android Performance Tuner 适用于 Android Vitals。

  • Android Performance Tuner 记录并汇总您的游戏或应用的实时帧时间和加载信息,以及您提供的游戏注释和保真度参数。
  • 当您使用 Android Performance Tuner 发布游戏或应用版本时,此性能数据会上传到 Google Play,并在 Android Vitals 中解锁新的性能洞察。

要获得这些性能洞察,您必须将 Android Performance Tuner 集成到您的游戏或应用中,然后将其发布到 Google Play:

要求

对于设备:

Android Performance Tuner (APT) 可在运行 Android 4.1(API 级别 16)或更高版本的任何 Android 设备(有或没有 Google Play 服务)上运行。这占所有活跃 Android 设备的 99% 以上。

对于所有开发人员:

  • 访问 Android Vitals
  • 产品仅适用于新版 Google Play 管理中心

Unity 开发人员的其他要求:

  • Unity 版本 2017.4 或更高版本和 .NET 版本 4.6
  • 要使用 APK 扩展文件,需要 Unity 2018.2
  • 为了改进帧节奏和 GPU 测量,需要 Unity 版本 2019.3.14 或更高版本

了解 Android 性能调整器

我们有代码实验室来指导您将 Android Performance Tuner 集成到您的游戏中,以实现 C/C++ 和 Unity 引擎的集成:

C/C++ 和 Unity 引擎 SDK 的参考:

Memory Advice API 概览

 

Memory Advice API 是一个实验性的索引 API,可帮助 Android 应用程序满足内存用量的安全限制。该 API 能够及时保持使用的内存资源量,可以在一定程度上向应用程序发出通知。该 API 还可以使用报告的内存使用量。

注意:您可以使用 Memory Advice API 替代onTrimMemory事件来管理内存。

该 API 提供的和生成的任何更改应用程序何时更改其内存内容,或为应用程序寻找改进空间。可能包括调整内存占用的资源,例如降低视觉音频的细节和质量。

ES 的 Advice 的 Advice 商城由内存分配的最多内存占用以及由 OpenGL API 分配的内存类型 API,内存类型和内存 API 应用

变化如下:

  • API采集的设备指标
  • 来自设备的机器学习数据
  • 设备测试

在 API 等级中,Memory Advice API 会定义常用的建议状态,并通过常用函数将这些状态传递给应用。

使用入门

情况

Memory Advice API 是 Android Game Development Kit (AGDK) 的一部分,然后通过以下传播:

Android Games 版本适用于使用环境推荐的 Memory Advice API 版本。 Android Studio,我们建议使用 Jetpack 版本。Android Game Development Extension (AGDE),我们使用 AGDK 下载建议页面的版本。

功能

本部分介绍了 Memory Advice API 的功能。

内存状态

该API会向应用报告以下内存状态:

  • MEMOYADVICE_STATE_OK
  • MEMOYADVICE_STATE_APPROACHING_LIMIT
  • MEMOYADVICE_STATE_CRITICAL

了解详情,请查看memoryadvice_memorystate页面。

报告内存状态

该 API 支持通过轮询或智能报告内存状态:

  • 询轮
    应用可以随时调用该 API 来检索内存状态。

  • 建议
    应用内存建议 API 可以通过调用函数。应用频率为建议调用系统。该 API 会使用频率来确定应用内存限制安全限制或极低时执行此条件的时机。如果内存条件安全,则不能正常执行。不是从应用的线程中执行,而不是从应用的线程中执行。

常见和常见注意事项

内存建议使用计算时间来生成内存状态。但每次调用设备通常会调用 1 次 API 到 3 小时的紧急情况。此想。

要求

设备要求

  • Android 4.4(API 版本等级 19)或更高

应用要求

  • 该API支持蒯应用(仅使用C/C++主要编写的应用)。

  • 该 API 仅支持 64 位应用。

NDK 版本要求

Memory Advice API 版本支持大多数常见的 NDK 版本。请查看版本说明,查看受支持的 NDK 列表。

注意完整的 AGDK 库下载内容支持添加其他版本的 NDK。

其他资源

问题和反馈

Memory Advice API 目前欢迎发现有任何测试版阶段的问题,您可以反馈。如果有任何建议或正在使用 API 创建该问题,请在 Issueer 中的问题中找到。

//

Memory Advice API 使用入门

本指南介绍了如何使用 Android Studio 将 Memory Advice API 的 Jetpack 版本集成到您的应用中。

Android Games 应使用为其构建环境推荐的 Memory Advice API 版本。对于 Android Studio,我们建议使用 Jetpack 版本。如需了解适用于其他构建环境(例如 Android Game Development Extension (AGDE))的版本,请参阅分发情况

添加库

本部分介绍了如何将库添加到您的 Android Studio(Android Gradle 插件)项目中。

添加依赖项

若要将库添加到 Android Studio 项目,请完成以下步骤:

  1. 在项目级 gradle.properties 中启用 Android Jetpack 库,该文件通常位于项目的根目录中:

      android.useAndroidX=true
    
  2. 打开模块级 build.gradle 文件,并将以下 implementation 添加到依赖项代码块中。这会在应用中声明 Memory Advice API 依赖项

     dependencies {
         implementation 'androidx.games:games-memory-advice:1.0.0-beta01'
     }
    
  3. 在 android 代码块内指定 NDK 版本:

     ndkVersion "23.1.7779620"
    

    请务必选择与 Memory Advice API 兼容的 NDK 版本。Android Games Jetpack 版本页面上列出了受支持的 NDK 版本。

  4. 为 CMake 声明其他构建标志。为此,请将以下代码添加到 android 代码块内的 defaultConfig 代码块中:

     externalNativeBuild {
         cmake {
             cppFlags '-std=c++14'
             // c++_shared flavor is the only supported STL type.
             arguments "-DANDROID_STL=c++_shared"
         }
     }
    
  5. 启用 Prefab 功能。 对于 Android Gradle 插件 (AGP) 4.1 或更高版本,请将以下代码添加到 android 代码块中:

     buildFeatures {
        prefab true
     }
    

    如果您使用的是 AGP 4.0 或更低版本,请参阅 Prefab 页面了解配置说明。

  6. 保存文件。如果您看到以下消息,请点击 Sync Now 按钮以更新您的项目:

      Gradle files have changed since last project sync. A project sync may be
      necessary for the IDE to work properly.
    

为 C/C++ build 配置 CMake

如需将 Memory Advice API 的头文件和运行时库添加到项目中,请打开项目的主 CMakeLists.txt 文件。在 Project 窗格中,该文件位于 app > src > main > cpp 中。打开文件后,请执行以下步骤:

  1. 在文件顶部附近的任何 cmake_minimum_required 和 project 行之后,添加以下行:

     find_package(games-memory-advice REQUIRED CONFIG)
    
  2. 在 target_link_libraries 命令中添加 games-memory-advice::memory_advice。这会使 Memory Advice API 成为您项目的原生库的依赖项,并将其包含在最终应用软件包中。 更新代码应与以下代码类似:

     target_link_libraries(
         your-native-lib
    
         #link memory advice to the project
         games-memory-advice::memory_advice
    
         #rest of the dependencies
         #...
     )
    

配置 Java 文件

Memory Advice API 中包含的原生库是 libmemory_advice.so。它是应用自己的 C/C++ 共享库的编译依赖项,将在应用使用 System.loadlibrary() 函数加载自己的共享库时自动加载。

这是可选步骤。

  1. 在项目中找到加载原生库的 Java 代码。如果该代码不存在,请予以添加。该代码应类似于 System.loadLibrary("your-native-lib"),并位于 static 代码块中。

  2. 在 System.loadLibrary("your-native-lib") 下添加 System.loadLibrary("memory_advice")。更新代码应与以下代码类似:

     static {
         System.loadLibrary("your-native-lib");
         // Note: loading libmemory_advice.so is optional.
         System.loadLibrary("memory_advice");
     }
    

使用库

本部分介绍如何使用该库。

添加头文件

在项目中添加以下库头文件:

    #include <memory_advice/memory_advice.h>

初始化库

您需要在应用启动时初始化一次库。为此,请将以下代码添加到项目中:

    MemoryAdvice_init(env, activity);

env 和 activity 参数是应为您的原生库提供的 JNIEnv* 和 jobject 变量。对您原生库的每个 JNI 调用都应包含这两个变量。如果您使用的是 GameActivity 库,请务必将调用线程附加到 JavaVM 后再调用 MemoryAdvice_init 函数。

内存状态轮询

您可以通过按选择的时间间隔轮询库,来检索应用的内存状态。如果您需要轮询库,请使用 MemoryAdvice_getMemoryState 函数:

    MemoryAdvice_MemoryState state = MemoryAdvice_getMemoryState();
    switch (state) {
      case MEMORYADVICE_STATE_OK:
        // The application can safely allocate significant memory.
        break;
      case MEMORYADVICE_STATE_APPROACHING_LIMIT:
        // The application should free memory as soon as possible, until the memory
        // state changes.
        break;
      case MEMORYADVICE_STATE_CRITICAL:
        // The application should not allocate significant memory.
        break;
    }

设置观察器

您也可以设置观察器并注册 Memory Advice API,并在状态接近上限或紧急内存状态(但不适用于 ok 状态)时调用 watcher 函数。例如,以下代码会创建一个观察器并每 2 秒请求 Memory Advice API 通知:

    static int USER_DATA;
    constexpr int callback_waittime_ms = 2000;

    void callback(MemoryAdvice_MemoryState state, void* context) {
        switch (state) {
          case MEMORYADVICE_STATE_APPROACHING_LIMIT:
            // The application should free memory as soon as possible, until the memory state
            // changes.
            break;
          case MEMORYADVICE_STATE_CRITICAL:
            // The application should not allocate significant memory.
            break;
        }
    }

    MemoryAdvice_registerWatcher(callback_waittime_ms, callback, &USER_DATA);

后续操作

如需查看其他资源报告问题,请参阅概览

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Game_jqd/article/details/125027595

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签