admin 管理员组文章数量: 1184232
目标
- 为什么我的游戏加载时间那么长?
- 为什么播放游戏声音时延迟那么长?
- 为什么声音文件占那么多的内存?
- 为什么我一播放声音游戏就那么卡?
-
难道是因为我在开发时对声音的处理有问题?
也许你在加载声音时都会出现以上的问题冲到你的脑门上!!
好吧,我知道这种感觉!!声音管理起来很棘手;当我开发第一个游戏的时候我也有遇到过相同的问题。我在网上任何地方都找不到原因和解决方案。所以我决定发布这篇文章,希望能帮助到你。
测试
如果你是Unity初学者,首先需要弄清楚声音管理如何在Unity中工作的。
为此,你可以参照下面的链接,去了解一下
Audio Clips
、
Audio Listeners
、
AudioSources
的基本操作:
在Unity中的声音管理是非常简单和基本的,它是如何影响我的游戏呢?
- 是的,非常简单哦,但是它(声音管理)却能让你的游戏陷入困境!
- 让我们通过一个简单的案例去理解它吧。
设置场景,如下所示:
- 创建一个Canvas,给它添加两个Button控件(一个名为Music-Button,另一个为Sound-Button)。
- 在Main Camera下创建一个空物体命名为AudioSources,且又在它下面再创建两个空物体分别命名为“BackgroundMusic”和“SFX-Sounds”。
-
然后创建一个空物体(Empty GameObject),并命名为“SoundManager”。(名字随你来)
在hierarchy中层次关系如下所示:
创建一个脚本,如下所示:
using UnityEngine;publicclassSoundManager:MonoBehaviour{#region BACKGROUND_MUSICpublic AudioClip[] backgroundMusicClipsArray;publicAudioSource backgroundMusicSource;#endregion#region SFX_SOUNDSpublic AudioClip[] SFXSounds;publicAudioSource SFXAudioSource;#endregion#region PUBLIC_METHODSpublicvoidPlayRandomMusic(){
backgroundMusicSource.clip = backgroundMusicClipsArray[Random.Range(0, backgroundMusicClipsArray.Length)];
backgroundMusicSource.Play();}publicvoidPlayRandomSFXSounds(){
SFXAudioSource.PlayOneShot(SFXSounds[Random.Range(0, SFXSounds.Length)]);}#endregion}
在这里,对于背景音乐和SFX声音(SFX声音就是一点短的音频剪辑,如跳跃的声音(Biu)等)我声明了两个
Audio Clip
的数组,名字分别为:backgroundMusicClipsArray和 SFXSounds(分别用来存放对应的声音资源)。
也声明了两个
AudioSource
类型的成员变量(就是对应的“BackgroundMusic”和“SFX-Sounds”,记得把他们拖到脚本上哦)。
这里有两个名为
PlayRandomMusic()
和
PlayRandomSFXSounds()
的方法,用于在我们调用该方法时播放随机音乐/声音。然后为对应的Button添加对应的响应事件。把AudioClips的设置全设为默认即可。
现在测试它在编辑器是否能正常工作。
把发布平台设置为安卓平台
生成
Android Build
的时候记得把
Development Build
和
Auto Connect Profiler
勾选上,如下图所示:
- 在你手机上开始游戏,你有发现到什么奇怪的事情吗?
-
加载游戏花了多少时间?
对于我,从Unity的默认界面加载到游戏界面我大约花了 10-15 秒,我的游戏中大概有15个背景音乐和40个SFX声音片段。
现在,查看一下Profiler,在Profiler中找到Audio模块。如下图所示(下面第一张图是我自己弄得,怕大伙们找不到Audio模块。。)
好吧,那我该怎么做呢?
放心伙计,总会有办法解决的!但这里的问题是,
“哪一个是最好的解决方案?”
让我们采取某些措施,并且继续我们的案例去获得答案。
在Audio Clips修改一些设置
要想更好的理解这一步,可以通过下面链接去了解AudioClips的设置:
现在选择所有的背景音乐资源。
在Inspector中的设置将会如下图所示:
准备Android Build
所有
Building
的步骤都和上面的一样。
你有看到什么不同嘛?
在我这边,我的游戏加载时间
从15秒变为了2秒
…!这将比原来的
加载时间快了5-7倍
啊~!!!
设备的不同
不同的设备效果也许会不一样,这将取决于你的CPU和内存,在这里,我使用的手机型号是“Motorola MOTOG2”
现在让我回到Profiler中,你有发现什么改变吗?
Total Audio Memory居然
从147.7MB降到了5.8MB
!!这便
优化了25倍的内存
使用啊~!!!
噢,太神奇了!!但是为什么这样呢?
在案例中,我们禁用了预加载音频(
Preload Audio Data
),因此就没有必要在开始的时候加载所有的音频剪辑,这便减少了加载时间!这将会在需要用到音频的时候才会去加载它。
也许你现在会想,“一旦我加载和使用了所有的音频剪辑,它们会不会占用内存呢?”
你是否还记得我们把
Load Type
设置为
Streaming
,音频剪辑将放入缓存区中,并且从缓存区中播放,一旦播放完后,便被卸载掉,这便释放了内存。因此便优化了内存的使用。
你可能会有另一个问题,“为什么不为
SFX声音
做同样的操作呢?”
因为
SFX声音
在游戏运行中会经常使用到,因此会有一点小延迟是无关紧要的。事实上,我推荐将
Load Type
设置为
Decompress on Load
(在加载时解压)会运行的更流畅(并不是使用于任何的音频,只是使用于频繁使用的音频)。
无论如何,哪怕你有50个SFX Sounds,只要它不占用10-20MB的内存,那么还是可以接受的。
下图中显示了40个
Load Type
设置为
Decompress on Load
的
SFX AudioClips
的
Total Audio Memory
仍然为16MB,这对于我来说已经很不错了!!
这太有用了!!声音的优化是必须的啊!!
是的,这是必须滴。如果我们能适当的优化声音资源,我们为在游戏运行中其他重要的资源留下了大量的内存资源,这便创建了一个流程的手机游戏。所以适当的优化和设置是必须的。
原文链接
原文链接:
版权声明:本文标题:困扰你的Unity游戏声音小问题?这里有一个简单有效的解决办法! 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1771177716a3541661.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论