使用 Snapdragon 及遇到的问题

/

常问问题

一般的

Snapdragon Profiler 的系统要求是什么?

  • 运行 Windows 7、Windows 8.x 或 Windows 10 的 PC,运行 OS X Yosemite (10.10) 或更高版本的 Mac,或运行 Ubuntu Linux 14.04 (Trusty) 或更高版本的 PC。
  • ADB 1.0.40(或更高版本)
  • Snapdragon Profiler 使用带有 GTK# 的 Mono 框架。如果您还没有安装它,您可以下载并安装此依赖项
  • 运行由 Snapdragon 处理器驱动的 Android 5.0(或更高版本)的移动设备。

Snapdragon Profiler 是否也适用于非 Snapdragon 设备?
Snapdragon Profiler 旨在与搭载 Snapdragon 处理器的设备配合使用。尽管非 Snapdragon 设备上可能存在一些有限的功能,但我们不保证非 Snapdragon 设备上的完整功能。

Snapdragon Profiler 与哪些开发 Snapdragon 设备配合使用?
Snapdragon Profiler 适用于所有搭载 Snapdragon 处理器的设备,包括商用和开发板。

对于 Android,我们建议使用 Nexus 设备或运行 Android 5.0(或更高版本)的 Snapdragon Mobile 开发平台。

设置和安装

Snapdragon Profiler 的安装程序是什么?
在 Windows 上:

  • 在主机上运行安装程序可执行文件。安装程序将引导您完成所需的步骤,并提示您提供它无法找到的任何依赖项。
  • 建议以管理员权限运行安装程序。

在 Mac OS X 上:

  • 下载并安装适用于 Mac OS X的最新 Mono 框架。
  • 安装 Mono 后,通过在 Finder 中单击来安装 Snapdragon Profiler .dmg 图像
  • 确保将“SnapdragonProfiler.app”拖到“应用程序”文件夹中

在 Ubuntu Linux 上:

  • 下载并安装适用于 Linux 的最新 Mono 框架
  • 使用 sudo apt-get install libc++1 安装 libc++ C++ 标准库
  • 使用 sudo apt-get install default-jre 安装 Java Runtime 1.7.0_79 或更高版本
  • 使用 sudo apt-get install android-tools-adb 安装 adb 1.0.40 或更高版本

使用 tar zxvf SnapdragonProfiler_Release_External_Linux.tar.gz 将 Snapdragon Profiler 压缩包解压到所需目录

该工具安装在哪里?

  • 在 Windows 上,Snapdragon Profiler 将安装到“C:\Program Files (x86)\Qualcomm\Snapdragon Profiler”。
  • 在 Mac OS X 上,Snapdragon Profiler 将在您的应用程序文件夹中可用。
  • 在 Ubuntu Linux 上,可以从 tarball 解压到的目录中使用 Snapdragon Profiler。

安装此工具会修改我的环境变量吗?
不,但 Snapdragon Profiler 确实希望 ADB 可以通过您的系统 PATH 访问。

能力

Snapdragon Profiler 支持哪些功能?

  • 实时视图可以轻松关联时间线上的系统资源使用情况。分析 CPU、GPU、DSP、内存、功耗、散热和网络数据指标
  • Trace Capture 模式允许您在时间线上可视化内核和系统事件,以分析 CPU、GPU 和 DSP 中的低级系统事件
  • 快照捕获模式允许您从任何 OpenGL ES 应用程序捕获和调试渲染帧***
  • 图形和计算 API 支持包括:OpenGL ES 3.2、OpenCL 2.1 和 Vulkan 1.0**

* 需要 Snapdragon 820(或更高版本)处理器
** 需要 Android N(或带有支持 Vulkan 的图形驱动程序的 Android 6.0 设备)。Vulkan 分析目前仅在有根设备上的 Trace Capture 模式下可用。
*** 需要 Snapdragon 805(或更高版本)处理器和 Android 6.0(或更高版本)

Snapdragon Profiler 能否帮助测量功耗?
是的,尽管我们建议通过 ADB Wi-Fi 连接您的设备时获得最准确的功率测量,因为 USB 连接会干扰功率测量。

故障排除

为什么我无法连接到我的设备?
打开命令提示符或终端,并通过“adb devices”命令确认您的设备已为 ADB 设置,状态为“device”。如果收到超时消息,请尝试增加文件/设置下的设备连接超时值。一旦您确认并消除了 ADB 连接问题,请在Snapdragon Profiler 支持论坛上联系我们。

有时当我添加实时指标时,轨道没有任何数据。
如果您选择的指标不会触发生成分析数据的系统事件,那么 Snapdragon Profiler 将不会显示数据。

当我选择我的应用程序并运行快照捕获时,什么也没有发生。
Snapdragon Profiler 与图形驱动程序交互,以查询在快照中收集的信息以获取渲染帧。某些设备可能没有收集此数据和正确支持快照所需的驱动程序更新。此功能需要 Android 6.0(或更高版本)。

为什么我在我的设备上看不到 FPS?
要查看 FPS,请选择您的流程,您应该会在指标列表中看到新类别。展开“EGL”类别,FPS 应该是您的指标选项之一。FPS 仅适用于在 Snapdragon 805(或更高版本)移动设备上运行的 OpenGL ES 应用程序。

为什么我看不到 Vulkan 指标? 

  • 确保您具有 ADB 根访问权限
  • 确认所有 Vulkan 库都位于正确的位置并启用写入权限
  • 连接到 Snapdragon Profiler 后启动您的应用
  • 确认您有支持的设备:需要 Android N(或带有支持 Vulkan 的图形驱动程序的 Android 6.0 设备(如三星 Galaxy 7)。

使用 Snapdragon Profiler 提高应用程序的性能

您如何知道您的应用程序正在以最佳性能运行?您如何确保您投入的所有工作都能带来最佳的用户体验?

我们设计了 Snapdragon® Profiler,因此您可以深入研究并找出阻碍用户对您的应用程序性能完全满意的问题。使用 Snapdragon Profiler,您可以探索帧速率滞后、温度峰值、丢帧、锯齿状边缘和游戏抖动等问题的根源。您可以检查对它们负责的调用,修改您的代码并衡量改进。

Snapdragon Profiler 可让您分析 CPU、GPU、DSP、内存、功耗、散热和网络数据,从而找到并修复性能瓶颈。它是一种理想的工具,可以确认您对应用程序正在做什么以及它的行为方式的假设(以及找出它可能在做什么您不打算做的事情)。

Windows、Linux 和 macOS 的安装程序包括文档。Adreno GPU SDK 包括演示应用程序景深,用于以下案例研究。

您可以分析在为 Android 开发设置并通过 ADB(通过 Wi-Fi 或 USB)连接到您的开发机器的设备上运行的应用程序。

  • 实时视图可让您从 150 多个硬件性能计数器中进行选择,并在时间线上关联系统资源使用情况,如下所示:
  • 使用 Trace Capture 模式,您可以在时间线上跟踪内核和系统事件,以分析 CPU、GPU 和 DSP 中的低级系统事件,如下所示:
  • 快照捕获模式捕获应用程序为一帧所做的所有图形 API 调用和参数。它对于检测导致不正确渲染的逻辑错误很有用。在这种模式下,您可以从 OpenGL ES 和 Vulkan 应用程序中捕获和调试渲染帧,甚至可以单步执行和重播渲染帧,逐个绘制调用:

 

识别应用程序瓶颈

探索性能的初步高级步骤

每秒多少帧?

在开始使用 Snapdragon Profiler 之前,您可能已经知道存在性能问题。即使您不这样做,第一步也是检查应用程序当前的整体性能并尝试识别应用程序瓶颈。

帧速率是一个理想的起点。游戏等应用程序通常以每秒 30 或 60 帧 (fps) 的速度运行最佳,虚拟和扩展现实 (VR/XR) 应用程序的速度有时更高。

这有两个方面。第一个是平均帧速率,衡量应用程序平均运行的速度。二是帧率的一致性。即使您的平均帧速率接近目标帧速率,偶尔长帧也可能会错过该目标。然后,用户体验会出现卡顿和故障,并且动作不流畅,因此您的应用可以使用优化。

如果您的应用未优化,平均帧速率可能会低于您的目标,并且应用将无法达到其所需的性能水平。另一方面,如果您优化了应用程序,您可能会更接近平均水平,但帧速率仍会出现周期性峰值。尖峰阻碍了动画,因此您需要通过识别问题和修改代码来消除这些尖峰。

在这两种情况下,Snapdragon Profiler 都可以将您直接带到应用程序的 fps 性能级别。下面的屏幕截图显示了 42.022 fps 的平均(浅蓝色线)。

虽然平均 42 fps 可能就足够了,但范围(蓝线)会周期性地降至 37.322 fps。这表明该应用程序正在丢帧,这会损害性能。

另请注意,应用程序应选择达到其平台 Vsync 速率的除数或倍数的帧速率。由于典型平台具有 60Hz Vsync,因此 30Hz 或 60Hz 实际上是唯一可接受的目标。

探索潜在的瓶颈

虽然没有单一指标可以告诉您性能问题所在以及如何解决这些问题,但 Snapdragon Profiler 可让您检查数十个指标并开始了解您的应用程序如何与硬件交互。下面的 Trace Capture 模式屏幕截图中的部分对应于您可以开始使用的三个重要指标:

  • Snapdragon Profiler 中的每个渲染阶段都是一个指标,代表应用程序在 GPU 上的执行情况。每个数据磁道都是度量的子集,磁道的数量因应用程序而异。在以下屏幕截图中,绿色、洋红色和紫色条显示各个表面,表面条下方的轨迹代表相关的渲染阶段:
  • GPU Activity(下图)是一个系统指标,显示 CPU 和 GPU 之间的交互。
  • CPU 调度(“跟踪内核 - 调度 CPU”)是另一个系统指标。它概述了应用程序在每个 CPU 内核上的执行情况。您可以查看应用程序的哪些部分在哪里运行,以及您是否有调度或线程争用问题。

借助这些和其他指标,您可以探索性能可能受到限制的三个主要领域:GPU、CPU 和 Vsync,或显示器上的垂直同步刷新。

GPU 绑定的应用程序

在图形密集型应用程序中,使用 GPU 开始消除过程是最容易的。

在 Snapdragon Profiler 的实时视图中,GPU % Utilization 是一个顶级指标。下面的屏幕截图显示了 26% 到 38% 的利用率:

除了实时视图,Snapdragon Profiler 中的 Trace Capture 模式为您提供了另一个参考点。如果应用程序不受 GPU 限制,则可能会出现 GPU 活动间隙:但是,如果应用程序受 GPU 限制,则 GPU 执行可能会延迟,并且 GPU 可能会不断地渲染表面: 

我们将沿着下面的 GPU 绑定应用程序的路径继续下去,但首先我们检查另外两个潜在的阻塞点。

受 CPU 限制的应用程序

如果 GPU 预感没有成功,请查看应用程序是否受 CPU 限制。

与受 GPU 限制的应用程序不同,实时视图中的 CPU % Utilization 并不是受 CPU 限制的应用程序的可靠指标,如以下屏幕截图所示:

第一个应用程序的平均 CPU 利用率为 16%,第二个应用程序为 23%。第一个是受 CPU 限制的,但它们之间的差异并不像上面的受 GPU 限制的应用程序那样显着,因此该应用程序可能看起来不受 CPU 限制。

受 CPU 限制的应用程序的两个重要标准是它不受 GPU 限制,并且它的平均帧时间超过 16 毫秒。要确定应用程序是否受 CPU 限制,请考虑应用程序和 CPU 的多线程性质。此外,超越 CPU 百分比利用率并检查频率和线程调度等指标也很有帮助。

在下面的 Trace Capture 模式截图中,Sched CPU 6 中的线程似乎成为了 CPU 的瓶颈:

下一步是深入研究该线程,以确定多线程的热点和候选者。采样捕获模式以固定的时间间隔定期对 CPU 程序计数器进行采样并识别 CPU 热路径。它提供了活动的统计表示,包括在每个函数和库中花费的时间。您可以查看代码中的哪些函数占用最多的执行时间。

以下捕获显示了在 CPU 上运行以渲染布料纹理的函数和函数序列。红色和橙色块表示应用代码中的热点:

在这种情况下,CPU 采样显示 SatisfyConstraints() 是最大的热点,有 98% 的活动。

更深入地讲,Snapdragon Profiler 支持用户标记和内置于 Android NDK 中的 Native Tracing API。换句话说,Android 开发人员可以使用该 API 将跟踪标记插入到应用程序代码中,并在 Snapdragon Profiler 中查看这些数据。

在此示例中,您可以使用 android/trace.h 来检测 SatisfyConstraints() 调用并将其追溯到主线程,这是一个工作函数:

渲染帧中的纹理需要每个布料一个函数,它根据经过时间的需要滴答作响。一旦您修改了应用程序代码以线程化功能,Snapdragon Profiler 可以立即显示所有活动的以下包容性相关视图: 

现在,布料计算正在多个线程中进行。CPU Scheduling 中的输出显示更多线程。该应用程序不再受 CPU 限制,因此 CPU 等待分派绘制。

该过程是识别、诊断和解决 Snapdragon Profiler 性能问题的典型过程。

垂直同步绑定应用

如果您确定应用程序既不受 CPU 限制,也不受 GPU 限制,则它可能受 Vsync 限制;也就是说,它的运行速度可能与显示硬件所能容纳的一样快。在 Snapdragon Profiler 中使用 Trace Capture 模式,您可能会看到类似以下内容:

请注意,帧时间大约为 16 毫秒(1 秒除以 60 fps),并且在帧结束附近有一个间隙,在此期间 GPU 和 CPU 都在等待可用的表面进行渲染。这意味着应用程序的运行速度与显示器的刷新率允许的一样快。

许多应用程序的目标是在显示允许的范围内以最快的速度运行。但即使应用程序受 Vsync 限制,仍可能有优化的机会,其好处不仅仅是更高的帧速率。

移动应用程序中的大多数问题归结为功耗,因此,电池寿命。即使您的应用能够在不绑定 CPU 和 GPU 的情况下满足目标帧速率,您可能仍需要优化您的代码。如果修改为使用更少的功率并在更低的温度下运行,应用程序将在完成目标帧速率的同时减少工作量。它还可能在低端设备上提供更好的性能。

//

避免 GMEM 负载

每帧后清除或无效所有帧缓冲区附件

由于移动 GPU 的硬件条件不同,某些在 PC 和游戏机等平台上运行良好的编程技术可能无法很好地移植到移动设备上。

图形内存 (GMEM) 负载是影响移动应用程序中 GPU 性能的最常见问题之一。在本节中,我们将向您展示如何使用 Snapdragon Profiler 在您的应用代码中查找 GMEM 负载。

GMEM 负载剖析

Qualcomm® Adreno™ GPU 的平铺架构管道包括一个渲染通道,在此过程中,每个平铺都被渲染到 GMEM 中。按照驱动程序的正常行为,前一个帧缓冲区数据从主内存加载到每个图块的 GMEM 中;换句话说,发生了 GMEM 加载(或未解决)。

问题是每个 GMEM 加载都会减慢处理速度。但是,如果帧缓冲区的内容被清除或无效,则驱动程序可以清除 GMEM 中的该图块。尽管这涉及额外的图形调用及其相关的开销,但它比为每个正在渲染的 bin 将帧缓冲区加载回 GMEM 更便宜。

GMEM 负载有两个主要原因:

  • 对驱动程序的不当提示——应用程序代码使驱动程序认为需要帧缓冲区的先前内容,通常是忽略了清除缓冲区。这归结为一个相对简单的修复,它在减少渲染时间方面得到了很好的回报。它主要适用于 OpenGL ES 编程,因为 Vulkan 显式处理条件。
  • 算法——某些 API,如glReadPixels和glFlush强制管道刷新以获得结果。在恢复绘制帧内容时,执行此中间帧将导致 GMEM 加载。您通常可以通过修改算法来避免 GMEM 加载。

在 Snapdragon Profiler 中检测 GMEM 负载

在 Trace Capture 模式下使用 Snapdragon Profiler,您可以允许 Rendering Stages 指标在自己的轨迹中突出显示 GMEM 负载。下面的屏幕截图基于景深演示应用程序,显示了红色块,说明 GMEM 加载(深度模板)是在渲染四个不同的表面(0、16、32 和 48)时发生的:

如果不需要 GMEM 加载,您可以回收大约 9% 的帧时间。

下一步是在 Snapdragon Profiler 中使用快照捕获模式来尝试确定导致 GMEM 加载的原因,如下所示:

  1. GMEM 加载的第一个表面是第一个表面绑定——glBindFrameBuffer。帧缓冲区参数设置为 1 。
  2. 选择帧缓冲区对象 1 (FBO 1) 以检查资源。检查器视图显示表面具有颜色、深度和模板的附件。
  3. glClearColor和glClearDepth调用让 GPU认为Stencil 附件的内容与下一帧相关,这会导致 GMEM 加载。
  4. 同样,其他三个表面(此处为 ID 5、7 和 9)具有 Stencil 附件并且不清除它。

修改代码以从帧缓冲区中显式清除 Stencil 内容后,您可以在 Trace Capture 模式下验证结果,该模式不再显示 GMEM Load Depth Stencil 轨迹:

在这种情况下,渲染时间缩短了大约 9%。

///

移除未使用的渲染目标

消除增加 GPU 工作负载但没有任何好处的调用

图形内存 (GMEM) 是 Qualcomm® Adreno™ GPU 内部的宝贵资源。GPU 根据帧缓冲区大小生成图块,然后通过解析图块在主内存中重建表面。该操作称为 GMEM 存储。更多的渲染目标意味着更多的瓦片,这意味着更多的 GMEM 存储操作和更大的性能损失可能性。

一个合适的比喻是,GMEM 就像 GPU 的高速 L1 缓存。将任何内容加载到该缓存中是昂贵的,除非必要,否则应避免。将该缓存中的任何内容存储到非平铺内存中也很昂贵,除非必要,否则应避免使用。

在 Trace Capture 模式下使用 Snapdragon Profiler,您可以允许 Rendering Stages 指标在自己的轨迹中突出显示 GMEM 存储。

下面的屏幕截图基于景深演示应用程序。底部的紫色块说明深度模板和颜色的 GMEM 存储是在渲染三个不同的表面(缩小和模糊帧缓冲区对象)时发生的:

单击这些表面会打开 Inspector 视图,其中包含表面块的属性。如下所示,如果存在,颜色、深度和模板附件将出现在此视图中: 

Inspector 视图是一种快速遍历所有绘制表面以查找附加渲染目标的不需要的方法。在这里,此帧的视图表明缩小和模糊帧缓冲区对象具有不需要的深度和模板附件。它们只是在工作和进行。

(“渲染目标”是高级图形 API 中使用的术语。“分箱”过程是 Adreno GPU 如何将特定大小的渲染目标划分为一个或多个分箱,然后这些分箱可以由针对目标的硬件处理GMEM。一块 GMEM 应该大致相当于 1 个 bin。)

优化选定曲面的代码后,您可以在 Trace Capture 模式下验证结果:

深度和模板的 GMEM 存储停止,因此这三个表面的渲染中断较少。这些表面的 Inspector 视图仍然显示 Color 附件,但现在没有 Depth 和 Stencil 附件: 

此外,渲染的 bin 数量从 8 个减少到 4 个。(此示例中 8 到 4 的减少是特定于这个特定的应用程序和工作负载的。一般来说,预测确切的减少是不可能的——甚至是容易的。 ,因为有几个特定于平台的变量在起作用,包括 GMEM 切片的大小和配置以及分箱过程的细节。)

在这种情况下,表面的渲染时间从 601 毫秒减少到 475 毫秒,减少了大约 5% 的总帧时间。

 

缩小渲染目标(如果可能)

检查性能和图形质量之间的权衡

如删除未使用的渲染目标中所述,更多的渲染目标意味着更多的瓦片需要更多的 GMEM 操作,从而影响性能。同样,更大的表面也意味着更多的瓦片和更多的 GMEM 操作。

但是在Avoid GMEM Loads and Remove Unused Render Targets中,该应用程序做了一些不必要的损害性能的事情,因此每次修复都会带来纯粹的性能提升。在其他情况下,选择并不那么明确。您可能必须在更好的性能和更高的图形质量之间做出决定。

您可以使用 Snapdragon Profiler 来帮助您做出决定。它的指标让您了解以不同质量级别渲染图形如何影响性能。根据结果​​,您可以向应用程序添加设置,让用户在性能和图形强度之间进行权衡。

在 Trace Capture 模式下使用 Snapdragon Profiler,您可以利用 Rendering Stages 指标。下面的屏幕截图基于景深演示应用程序:

单击表面可让您在 Inspector 视图中检查大小和颜色/深度/模板精度等属性,并快速遍历所有绘制的表面。找到缩小的候选对象后,您可以决定是否更改精度或大小。下面的屏幕截图显示了使用 DEPTH24_STENCIL8 目标的场景渲染: 

Inspector 视图显示 Stencil 附件现在不存在,渲染时间(持续时间)从 2.17 毫秒减少到 2 毫秒,整体性能得到了小幅提升。

此外,渲染的 bin 数量已从 30 降至 24。请注意,实际上无法预测代码更改将导致的 bin 减少类型。但是,一般来说,高度/宽度尺寸较小或每像素使用较少位的表面(例如,RenderTarget)将需要较少的箱(和 GMEM 瓦片)来处理。

/

使用 Adreno 进行抗锯齿

绕过昂贵的后处理方法

抗锯齿技术可减少 3D 场景中线条和形状边缘的锯齿状外观。GPU 上的工作量归结为一种受控模糊,以消除锯齿状外观。

抗锯齿非常占用内存和带宽,消耗大量电力。通常,具有平铺架构的移动 GPU 无法执行与 PC 和控制台中的 GPU 相同级别的后处理抗锯齿功能。

Qualcomm® Adreno™ GPU 具有有助于多采样抗锯齿 (MSAA) 的扩展,但采样级别存在限制。您可以执行 2x 级别的 MSAA,而不会在渲染管道中产生任何显着的额外成本,但高于该级别可能会变得昂贵。

以下流程图说明了使用 MSAA 的后处理抗锯齿方法:

虽然有效,但它涉及将渲染缓冲区 A 块传输到纹理 B 中,并且块传输在移动 GPU 上的成本很高。

下面的流程图显示了 blit 的一种成本较低的替代方案:

Adreno GPU 可以在 GMEM 中执行多采样,然后使用glFramebufferTexture2DMultisampleEXT将(GMEM 存储)解析为单采样纹理。bin 的数量将与渲染缓冲区中的 2xMSAA 相同。将图块解析到主内存时会进行过滤。

在 Trace Capture 模式下使用 Snapdragon Profiler,您可以利用 Rendering Stages 指标。在下面的屏幕截图中,blit 出现在底部轨道中:

Snapdragon Profiler 将抗锯齿级别显示为表面渲染块的 MSAA 属性: 

使用快照模式来帮助识别 blit 的来源,您可以确定在这种情况下它是由glBlitFramebuffer调用生成的,如上面第一个流程图中所述。

要实现第二个流程图中描述的替代技术,您可以将调用替换为glFramebufferTexture2DMultisampleEXT。渲染阶段视图中现在不存在 blit 轨道:

因此,避免了 blit,但表面块属性显示 bin 的数量仍然是 30,MSAA 的级别仍然是 2: 

更好的是,表面的渲染时间从 10.55ms 下降到 10.01ms,提高了 5%。

注意:并非所有 blit 都是警报或根本原因分析的原因。Mipmap 有时会在 blit 阶段在 GPU 中生成。Blits 也可能由正在使用的纹理更新引起。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

///

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值