在 Chrome 中对网络音频应用进行性能分析

了解如何使用 about://tracingAudion(Chrome 开发者工具中的 WebAudio 扩展程序)在 Chrome 中分析网络音频应用的性能。

Hongchan Choi

您之所以看到本文,可能是因为您正在开发的应用使用 Web Audio API,并遇到了意外故障,例如输出的爆破音或听到的内容。您可能已经参与了 crbug.com 讨论,Chrome 工程师要求您上传“跟踪数据”或查看图表可视化内容。本文介绍了如何获取相关信息,以便我们了解问题并最终解决根本问题。

about://tracing 和 Chrome 开发者工具中的 WebAudio 扩展程序有两个工具可以帮您分析网络音频。

当神秘的“故障”发生时。使用跟踪工具对应用进行性能分析可深入了解以下方面:

  • 特定函数调用在不同线程上花费的时间片
  • 时间轴视图中的音频回调时间

它通常会显示错过音频回调截止日期或可能导致意外音频干扰的大量垃圾回收。此信息对于了解基本问题非常有用,因此 Chromium 工程师经常会询问此信息,尤其是在本地再现不可行时。有关跟踪的一般说明,请点击此处

何时使用 Web Audio 开发者工具扩展程序?

当您想要直观呈现音频图表并监控音频渲染程序的实时表现时。音频图表(用于生成和合成音频流的 AudioNode 对象网络)通常会变得很复杂,但图表拓扑在设计上是不透明的。(Web Audio API 没有节点/图自检功能。)图表中发生了一些变化,现在您听到的是静音。然后,就可以通过监听进行调试了。这从来都不是一件容易的事,当音频图变大时,这就会变得更加困难。Web Audio DevTools 扩展程序可以通过可视化图表为您提供帮助。

借助此扩展程序,您可以监控渲染容量的运行估算值,了解网络音频渲染程序在给定渲染预算(例如约 2.67 毫秒 @ 48KHz)下的性能。如果容量接近 100%,则意味着您的应用很可能会出现故障,因为渲染程序无法在给定的预算内完成相应工作。

使用 about://tracing

如何捕获跟踪数据

以下说明适用于 Chrome 80 及更高版本。

为了获得最佳效果,请关闭所有其他标签页和窗口,并停用扩展程序。 或者,您也可以启动新的 Chrome 实例,或使用不同发布渠道(例如 Beta 版或 Canary 版)的其他 build。准备好浏览器后,请按以下步骤操作:

  1. 在标签页上打开应用(网页)。
  2. 打开另一个标签页,前往 about://tracing
  3. Record(录制)按钮,然后选择 Manually select settings(手动选择设置)。
  4. Record Categories(记录类别)和 Disabled by Default Categories(默认类别)部分中的 None 按钮。
  5. Record Categories(记录类别)部分,选择以下选项:
    • audio
    • blink_gc
    • media
    • v8.execute(如果您希望了解 AudioWorklet JS 代码性能)
    • webaudio
  6. 默认类别为停用的类别部分中,选择以下选项:
    • audio-worklet(如果您想了解 AudioWorklet 线程的起始位置)
    • webaudio.audionode(如果您需要每个 AudioNode 的详细跟踪记录)
  7. 按底部的录制按钮。
  8. 返回您的应用标签页,重新执行触发问题的步骤。
  9. 获得足够的跟踪数据后,返回“跟踪”标签页,然后按 Stop
  10. “跟踪”标签页会显示相应结果。

    跟踪完成后的屏幕截图。

  11. Save 以保存跟踪数据。

如何分析跟踪数据

跟踪数据直观呈现了 Chrome 的网页音频引擎如何渲染音频。渲染程序有两种不同的渲染模式:操作系统模式Worklet 模式。每种模式使用不同的线程模型,因此跟踪结果也不同。

操作系统模式

在操作系统模式下,AudioOutputDevice 线程会运行所有 Web 音频代码。AudioOutputDevice 是一个实时优先级线程,源自浏览器的音频服务,由音频硬件时钟驱动。如果您发现此通道中的轨迹数据出现不规则,则表示来自设备的回调时间可能会抖动。已知 Linux 和 Pulse Audio 组合会存在此问题。如需了解详情,请参阅以下 Chromium 问题:#825823#864463

操作系统模式跟踪结果的屏幕截图。

Worklet 模式

在 Worklet 模式下,一个线程从 AudioOutputDevice 跳到 AudioWorklet 线程,您应该会看到两个线程通道中对齐的轨迹,如下所示。激活 Worklet 后,所有网络音频操作都由 AudioWorklet 线程呈现。此线程目前不是实时优先级线程。 这种情况常见的不规律是由于垃圾回收或错过渲染截止日期而导致的一个大块。这两种情况都会导致音频流出现故障。

Worklet 模式跟踪结果的屏幕截图。

在这两种情况下,理想的跟踪数据的特征是:音频设备回调调用保持一致,并且渲染任务能在指定的渲染预算内顺利完成。上面的两个屏幕截图就是理想的跟踪数据示例。

从真实示例中学习

示例 1:超出渲染预算的渲染任务

下面的屏幕截图(Chromium 问题 796330)是一个典型示例,显示了 AudioWorkletProcessor 中的代码何时花费了太长时间并超出了给定的渲染预算。回调时间表现良好,但 Web Audio API 的音频处理函数调用未能在下一次设备回调之前完成工作。

显示因渲染任务超出预算而导致音频干扰的示意图。

您的选项

  • 减少使用 AudioNode 实例,减少音频图表的工作负载。
  • 减少 AudioWorkletProcessor 中的代码工作负载。
  • 增加 AudioContext 的基本延迟时间。

示例 2:在 Worklet 线程上执行大量垃圾回收

与操作系统音频渲染线程不同,垃圾回收在 Worklet 线程上管理。这意味着,如果您的代码执行内存分配/取消分配(例如新建数组),则最终会触发垃圾回收,而垃圾回收会同步阻塞线程。如果 Web 音频操作和垃圾回收的工作负载超出给定的渲染预算,则会导致音频流中出现故障。以下屏幕截图是这种情况的一个极端示例。

由垃圾回收引起的音频干扰。

您的选项

  • 预先分配内存,并尽可能重复使用。
  • 根据 SharedArrayBuffer 使用不同的设计模式。虽然这并不是一个完美的解决方案,但一些 Web 音频应用会将类似的模式与 SharedArrayBuffer 结合使用来运行密集型音频代码。示例:

示例 3:来自 AudioOutputDevice 的抖动音频设备回调

音频回调的精确时间对网络音频来说是最重要的。这应该是您系统中最精确的时钟。如果操作系统或其音频子系统无法保证可靠的回调时间,则所有后续操作都会受到影响。下图是抖动音频回调的示例。与前两张图片相比,每个回调之间的时间间隔差异很大。

比较不稳定回调时间与稳定回调时间的屏幕截图。

您的选项

使用 Web Audio 开发者工具扩展程序

您也可以使用专为 Web Audio API 设计的开发者工具扩展程序。与跟踪工具不同,这可以实时检查图表和性能指标。

此扩展程序需要从 Chrome 应用商店安装。

安装后,您可以通过打开 Chrome 开发者工具并点击顶部菜单中的“Web Audio”来访问该面板。

显示如何在 Chrome 开发者工具中打开“Web Audio”面板的屏幕截图。

网络音频面板包含四个组件:上下文选择器、属性检查器、图表可视化工具和性能监控器。

Chrome 开发者工具中的“Web Audio”面板的屏幕截图。

上下文选择器

由于一个页面可以有多个 BaseAudioContext 对象,因此您可以通过此下拉菜单选择要检查的上下文。您也可以点击左侧的垃圾桶图标,手动触发垃圾回收。

属性检查器

侧边栏显示了用户选择的上下文或 AudioNode 的各种属性。不支持检查“AudioParam”中的动态值。

图形可视化工具

此视图会呈现用户所选上下文的当前图表拓扑。该可视化效果会实时动态变化。通过点击可视化图表中的元素,您可以在属性检查器中检查详细信息。

性能监控

仅当选定的 BaseAudioContext 是实时运行的 AudioContext 时,底部的状态栏才处于活动状态。此竖条显示所选 AudioContext 的瞬时音频流质量,并且每秒更新一次。它提供了以下信息:

  • 回调间隔(毫秒):显示回调间隔的加权平均值/方差。理想情况下,平均值应保持稳定,且方差应接近零。如果您发现差异较大,则表示系统级音频回调函数的计时不稳定,可能会导致音频流质量不佳。(参见上面的示例 3。)

  • 渲染容量(百分比):当容量接近 100% 时,表示渲染程序针对给定的渲染预算执行了过多的处理,因此您应该考虑减少所用的资源(例如,在图中使用更少的 AudioNodes 对象)。

您可以点击垃圾桶图标,手动触发垃圾回收器。

旧版 WebAudio 开发者工具面板

此扩展程序现在是 Chrome Web Audio 团队的推荐方法,不过您也可以使用旧版 WebAudio 开发者工具面板。如需访问此面板,请点击开发者工具右上角的“三个点”菜单,然后前往更多工具,再点击 WebAudio

显示如何在 Chrome 开发者工具中打开 WebAudio 面板的屏幕截图。

总结

调试音频很困难。在浏览器中调试音频的难度更大。不过,这些工具可以为您提供有关 Web 音频代码性能的实用数据分析,从而减轻麻烦。但在某些情况下,您可能会在 Chrome 或扩展程序中发现问题。然后,不要害怕在 crbug.com 上扩展程序问题跟踪器上提交 bug。

照片由 Jonathan Velasquez 在 Unsplash 上推出