Wwise SDK 2023.1.9
|
“射线追踪”是一种可以高效地估算 N 阶反射和衍射的技术。它的基本理念是从听者端随机地投射射线,并通过一系列反射和衍射来追踪其路径。这种技术是在图形渲染技术的基础上演化而来的。最高反射阶数 [1-4] 和最高衍射阶数 [1-8] 值在 AkSpatialAudio.h
的 AkSpatialAudioInitSettings
结构中定义。有关更多详细信息,请参阅 AkSpatialAudioInitSettings 。
为了调节 Spatial Audio CPU 的性能和品质,射线追踪引擎使用了多项参数。有关 Spatial Audio 设置的详细说明,请参阅 AkSpatialAudioInitSettings()。
初级射线数调节起来比较麻烦,具体要看场景的复杂性(如三角形数量、衍射边缘数量)和发声体数量。在启用 CPU Limit Mode 时,射线追踪引擎会自动调节初级射线数量,以确保 CPU 使用率维持在用户定义的目标值上下。该模式可最大限度地避免 CPU 用量达到峰值,不过并没有办法完全消除短时和瞬时峰值。 通过设置较高的目标值,可提升品质(增加找到的反射和衍射路径数),但性能会有所下降。通过设置降低的目标值,可提升性能,但品质会有所下降。 在启用 CPU Limit Mode 时,初级射线数的上限为用户定义的初级射线数(参见 AkSpatialAudioInitSettings 章节)。在初级射线数降至 0 时,射线追踪引擎停止扫描环境。不过,仍会验证和更新现有声音传播路径。这时射线追踪引擎仍会消耗 CPU 资源。 注意,CPU Limit Mode 不会对 Portal 射线追踪产生显著影响。Portal 射线追踪会加重 CPU 负荷并可能因此强制 CPU Limit Mode 暂时减少初级射线数。
借助负荷均衡,可将 Spatial Audio 任务计算分摊到多个帧,从而尽量避免 CPU 用量达到峰值。Spatial Audio 会执行不同类型的任务(如射线投射和路径验证)来计算声音传播路径(反射和衍射)。在每次需要执行其中某项任务时,都会将其放到优先级队列中等待进一步处理而非马上执行。随后,会在负荷均衡分摊设置中指定的帧数内执行队列中的任务。
有多种方式可以调节 Spatial Audio 性能:应用 CPU Limit、更改反射阶数、启用或禁用衍射和对反射的衍射、调节振动阈值设置。您可以将负荷均衡与其他设置结合来实现品质和性能之间的理想平衡。
虽然在任何场景中都可以使用负荷均衡,但其最适合涉及多个活跃发声体的情形。负荷均衡行为可通过 AkSpatialAudioInitSettings::uLoadBalancingSpread 设置来控制(参见 AkSpatialAudioInitSettings 章节)。分摊到 1 帧相当于禁用功能,因为每项任务都会立即执行。数值越大,CPU 性能越高,但可能会导致结果不准确。比如,对于 1024 个样本的帧缓冲区分摊到 4 帧(约 21 ms/48 kHz),会在 84 ms 的时段内执行任务。在将分摊值设在 10 以下时,品质应当不会受到明显影响。
以下示例对相同场景下采用三个不同分摊值时的性能进行了对比:1(禁用)、4 和 10。该场景中包含 944 个三角形和 649 个衍射边缘。发声体数量为 4。反射阶数设为 4,同时启用了衍射。
下表显示了不同负荷均衡值对场景的影响。
Spread | Average CPU % | Max CPU % |
---|---|---|
Disabled | 4.8 | 52.76 |
4 | 3.16 | 23.26 |
10 | 1.71 | 10.22 |
负荷均衡会导致出现延迟吗?
不一定。在更新路径信息上会有延迟,但不会增加音频信号的延迟。比如,在下次更新之前可能会使用相同的射线。仍会在每帧计算路径,但是不会每帧都验证。也就是说,有些路径可能会不准确。比如,镜面反射位置可能会不太精准。
负荷均衡会提升 CPU 的平均性能吗?
虽然负荷均衡主要侧重于降低 CPU 峰值,不过也会降低 CPU 处理资源的平均用量,因为它会阻止同一类型的任务多次出现在队列中。若任务在队列中,则须先执行完该任务,然后才能将同一类型的另一任务添加到队列中。
在只有一个发声体时,负荷均衡会提升 CPU 性能吗?
不会有显著提升。路径验证是占用 CPU 处理资源最多的 Spatial Audio 任务。鉴于每个发声体都会执行一项路径验证任务,所以负荷均衡更适合涉及多个发声体的情形。不过,它可以避免进行重复计算。这样会略微提升只有一个发声体时的性能。
在每次需要执行 Spatial Audio 任务时,都会将其放到优先级队列中等待进一步处理而非马上执行。倘若任务已经在队列中,不会再次将其放到队列中。这样可以避免进行重复计算,从而降低 CPU 用量。在每一帧,都会根据队列中的元素数和负荷均衡分摊设置来计算所要处理的任务数 (N)。随后,会从队列中调取前 N 项优先任务并予以执行。
总的来说,任务优先级由任务的创建/插入时间决定:先执行较早的任务。对于有些任务(如路径验证),优先级的设定可能会所有不同。在每次发声体变为活跃状态时,都会提高路径验证任务的优先级,来强制执行对新路径的验证。这样可以避免在创建路径时产生延迟。
在针对射线追踪引擎定义几何构造时,存在一些限制。这些限制会对 CPU 性能和应用效果产生影响。
在三角形小于采样密度时,射线追踪引擎有可能会找不到它。
几何构造的可见角度 α 是指听者可从怎样的角度看到几何构造。两条射线之间的平均角度 γ 则会随着初级射线数变化。α 和 γ 之间的关系会影响找到与物体的交点(反射点或衍射点)的可能性。若 γ 小于 α,则找到交点的可能性较高。若 γ 大于 α,则找到交点的可能性较低。
几何构造中包含的三角形数会直接影响引擎的 CPU 用量:三角形越多,CPU 用量就越高。这是因为需要对物体进行更多的相交检测。通常,声音传播并不需要太过精细的几何构造。在不影响应用效果的前提下,可通过适当减少三角形数来提升 CPU 性能。
有些几何构造形状会比较不好处理。通常,像平面和箱体这样的几何构造处理起来较为简单,在声音传播方面的应用效果也最好。球体和圆柱体则容易出现错误。这是因为球体和圆柱体会涉及到曲率的问题。有些衍射边缘可能会无法找到,从而导致部分衍射路径丢失。大部分情况下会借助各种启发式算法来克服这一问题。通过增加初级射线数或简化几何构造也可解决该问题。
下表阐述了如何针对不同用例来调节相应参数。
故障 | 可能的解决方案 |
---|---|
Spatial Audio - General CPU 存在问题 |
|
Spatial Audio - Raytracing CPU is high |
|
Spatial Audio - Path Validation CPU is high and there is only one emitter |
|
Spatial Audio - Path Validation CPU 很高且有多个发声体 |
|
Spatial Audio - CPU 很高(同时涉及路径验证和射线追踪)且只有一个发声体 |
|