音频资源占用过高
这个连接是讲audioclip组件的一些信息:http://docs.unity3d.com/Manual/class-AudioClip.html 。
通过UWA在线资源检测查看音频片段页面,查看内存占用较高的音频文件是否合理。
大文件使用Streaming方式
可以看到有两个音频一个就占了将近16M的内存,这是十分不合理的。
- decompress on load:在加载时解压,用于较小的音频。对于Vorbis编码的声音加载时将使用大约十倍的内存。因此不要对大文件使用此选项。
- Compressed In Memory:将声音压缩在内存中并在播放时解压缩。此选项有轻微的性能开销(特别是对于 Ogg/Vorbis 压缩文件),因此仅将其用于较大的文件,因为加载时解压缩会使用大量内存。
- streaming:即时解码声音。使用最少的内存来缓冲从磁盘增量读取并动态解码的压缩数据。
总结:可以看到使用占用的内存越来越小,但是消耗的CPU也越来越大。
不要勾选Preload Audio Data
官方解释:如果启用,则在加载场景时将预加载音频剪辑。如果未设置此标志,则音频数据将在第一个 AudioSource.Play()/AudioSource.PlayOneShot() 上加载,或者可以通过 AudioSource.LoadAudioData() 加载并通过 AudioSource.UnloadAudioData() 再次卸载。
在我们的游戏中,AudioSource上面有很多的声音,因此场景一初始化就占据了大量内存。因此不能勾选。
进一步理解:
一般音频文件的用法都是:
放在AudioSource组件中的audioClip属性,将音频文件包装在AudioClip对象中,然后可以通过AudioSource的Play或者PlayOneShot方法触发播放
这样做会使得每个音频文件都将在场景初始化期间加载到内存中,因为场景包含对这些文件的即时引用,在需要这些文件之前必须先解析这些引用(启用了preload audioData)
如果禁用了preload audioData,就会导致unity在初始化场景期间跳过音频资源的加载
会将加载活动推迟到需要使用的音频文件时,也就是当调用Play的时候
禁用后会加快场景的初始化,但第一次播放文件的时候,必须将阻塞主线程直至完成
如果资源文件过大,会导致时间过长,卡顿非常明显,这是接受不了的
(也可以调用AudioClip.LoadAudioData()可以实现音频加载)
Load In Background
如果启用,音频剪辑将在后台加载,而不会导致主线程停顿。默认情况下这是关闭的,以确保在场景中所有 AudioClips 已完成加载然后进入游戏能开始播放。请注意,仍在后台加载的音频剪辑上的播放请求将被推迟到剪辑完成加载。加载状态可以通过 AudioClip.loadState 属性查询。
进一步理解:
其实就是决定播放音频是同步的还是异步的,如果没有勾选,会阻塞主线程,等音频加载好了才播放。如果勾选了,就是一个异步过程,会导致Play和音频实际播放会有延迟。(禁用了PreLoad Audio Data的情况下,因为勾选了PreLoad Audio Data表明加载场景时候就加载好了音频)