性能优化之艺术资源的优化(音频资源)

音频

  1. 导入音频文件
  2. 加载音频文件
  3. 编码格式与品质级别
  4. 音频性能加强
导入音频文件

在Project窗口中选中导入的音频文件的时候,Inspector窗口将显示多个导入设置,这些设置决定了加载行为、压缩行为、质量、采样率、以及是否支持双音道
很多音频的导入选项中可以基于每个平台的配置,允许在不同的目标平台上进行自定义的行为

加载音频文件
  1. Preload Audio Data 巨顶音频数据是在场景初始化期间自动加载还是在以后加载
  2. Load In BackGround 确定此加载活动是在完成之前阻塞主线程还是在后台异步加载
  3. Load Type 决定将什么类型的数据拉入内存,以及一次拉入多少数据
    在这里插入图片描述

如果使用不当,这三种加载类型都会对性能产生显著的负面影响

Preload Audio Data、 Load In BackGround

示例说明

音频文件的典型用例是将其分配到AudioSource对象的audioClip属性,然后通过AudioSource.p;ay()或者AudioSource.PlayOneShot()触发播放, 如果启用 Preload Audio Data,以这种方式分配的音频,在场景初始化的时候加载到内存,因为场景中包含对这些文件的即时引用。
如果禁用 Preload Audio Data会告诉Unity引擎,在场景初始化的期间跳过音频资源的加载,这将会将加载资源的活动推迟到需要音频文件的时候,因此,禁用这个选项会加快场景的初始化,但是这也意味着,当播放音频的时候,CPU需要立即访问磁盘,检索文件,将其加载到内存,解压缩并且播放,由于这是一个同步的过程,因此他将会阻塞主现程直到其完成,但是这样的话可能会造成音效的延迟,或者游戏的卡顿,给玩家很不好的体验;
因此如果希望得到快速的响应,需要提前将大部分音频素材加载到内存中;

调用AudioClip.LoadAudioData()可以实现音频加载,但是这也是一个同步的过程,加载文件可能也会导致掉帧,卸载音频可以使用 AudioClip.UnloadAudioData()

上述的方法都会存在掉帧的问题,那么现在应该使用的是Load In BackGround,该选项会将音频加载更改为异步过程,但是需要主义的是,启用这个选项之后,对AudioClip.LoadAudioData()的实际调用将会立即完成,但是,在单线程完成加载之前,文件还没有做好播放的准备,可以通过AudioClip.loadState来检查加载状态,如果启用了这个选项,但是如果不加载数据,直接使用AudioClip.play() ,Unity仍然需要在播放之前先把文件加载到内存,如果尝试在文件加载之前访问或者播放它,可能会导致不协调的行为;

LoadType

他的作用是只是音频数据如何加载

  1. Decompress on load
  2. Compressed in Memory
  3. Streaming
Decompress on load

此设置压缩磁盘上的文件,目的是节省空间,并在首次加载时,将其解压缩到内存中,这是加载音频文件的标准方法,在大多数情况下都应该使用这种选项目,由于解压缩会需要一段时间,这会导致加载过程中的额外开销,减少播放音频文件时所需要的工作量

Compressed in Memory

此设置在加载音频时只是将其从磁盘复制到内存中,只有在播放音频文件时,才会在运行期间对其解压缩,这将在播放音频的时候牺牲运行时的CPU,但是在音频休眠状态的时候,提高了加载速度,减少了运行时的内存消耗,因此这个选项最适合频繁使用的大型音频文件,或者在内存消耗上遇到难以解决的瓶颈,并且愿意牺牲一些CPu周期来播放音频

Streaming

此设置将在运行时加载、解码、播放,具体做法是,逐步将文件推过一个小的缓冲区,在缓冲区中一次只存在整个文件的一小部分数据,这种方法,对于特定的音频剪辑使用的内存量最小,但是运行时CPU使用的内存量最大,由于文件的每个回放实例都需要生成自己的缓冲区,因此此设置的缺点就是,当多此引用音频剪辑的时候,会导致内存中同一音频的多个夫本必须要单独处理,如果胡乱使用,将会增加运行时CPU的成本,也正是因为这样,这个选项最好用于那种定期播放的单实例音频剪辑

编码格式与品质级别

在这里插入图片描述
图片下面的数据信息就是各种格式选择的预估值
共三种编码格式

  1. Compressed
  2. PCM
  3. ADPCM
    只有在Compressed设置下才能不影响文件采样率的情况下更改质量,PCM和ADPCM没有这样的功能

PCM是一种无损的未压缩的音频格式,它以更加大的文件大小换取更高的音频质量,最适合用在短暂但是需要高清晰度的音效
ADPCM在大小和CPu消耗方面兜比PCM高效的多,但是压缩会产生相当大的噪音,如果用于那种具有混乱的短声音效果,如爆炸、碰撞,是一种比较好的选择
Compressed导致小文件的质量地狱PCM,但明现优于ADPCM,代价是在使用的时候使用额外的运行时CPU,大多数情况是使用这种格式的,此选项还可以自定义压缩算法的结果质量级别,在这里插入图片描述

音频性能增强

  1. 最小化活动音源的数量
  2. 为3D声音启用单音道
  3. 重新采样到低帧
  4. 考虑所有压缩格式
  5. 注意流媒体
  6. 谨慎的使用远程内容流
  7. 考虑用于背景音乐的音频模块文件
最小化活动音源数量

由于每个播放种的音频源消耗特定数量的CPU,因此禁用场景种冗余的音频源可以节省CPU周期,可以通过限制可以同时播放的音频数量
在unity assetstore中,几乎所有可用的音频管理资产都实现了某种类型的音频限制功能,(通常称音频池),由于从音频类型、立体声、分层、压缩等需要考虑的复杂性太多,所以不建议推出自己的音频池

为3D声音启用单音道

如果某些3D音频在两个通道上的位置相同的话,(也就是没有左耳和右耳听到声音的区别)那么可以强制开启单通道,这样可以节省50%文件的总磁盘和内存空间使用量

重新采样到低帧

在这里插入图片描述
将导入的音频文件重新采样到较低的频率将减少文件和运行时内存占用,有些音频可能需要高采样听起来才合理,如高调文件,但是也有很大一部分并不是,因此需要花点时间来测试,在不影响体验的情况下,尽可能的采取低采样;

考虑所有压缩格式

三种压缩格式都有自己的优缺点,要么我们去实现一个适用于所有音频的音频系统,要么我们需要花很大的时间去选择不同音频文件的;

注意流媒体

streaming 加载类型的优点就是在运行时内存成本低,因为它分配了一个小的缓冲区,文件数据像是队列一样连续推入缓冲区,但是,当分层或者转换的时候可能会遇到严重的问题,此时因该选择LoadType的另一种加载方式,手动控制加载和卸载,这也就是为什么该方式仅适用于北京音源、环境音效;

谨慎的使用远程内容流

可以使用WEB动态加载游戏内容,这是减少应用程序磁盘占用的有效办法;
WWW类提供AudioClip属性,但是访问这个属性将在每次调用时分配一个全新的AudioClip资源,一旦不再使用,就必须使用Resources.UnLoadAsset释放
而现在www类已经被UnityWebRequest类代替,这个类中,基于多媒体的请求应该通过UnityWebRequestMultimedia辅助类发送,因此如果请求AudioClip就应该调用UnityWebRequestMutimedia.GetAudioClip创建请求,然后调用DownloadHndlerAudioClip.GetContent在下载完成后取出音频内容,新版本的API如果多此通过DownloadHndlerAudioClip.GetContent获取内容不会导致额外的分配,只返回最初下载音频的引用

考虑用于背景音乐的音频模块文件

音频模块文件也被称之为音轨模块,时节省大量空间,并且没有任何明现质量损失的绝佳方式,音轨模块时以位流的形式读取的,必须在运行时解码以生成特定的声音,音轨模块包含许多小的,高质量的样本,并将整个音轨组织成类似于音乐表的形式,定义每个样本的播放时间、位置、音量、音高、特效等
,这样可以在保证高质量的同时显著的节省占用的空间大小。因此如果有机会为音乐文件使用音轨模块一定要好好探索以下

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值