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

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue

推荐文章

热门文章

相关标签