当我们播放音频时,操作系统会将音频加载到内存中,然后从内存中播放,如果音频比较小,可能没什么影响,但是如果音频比较大,就会出现明显的卡顿。我们可以选择一个合适的时机(比如加载地图时),提前加载音频,这样播放的时候就能直接从内存里读取,避免卡顿。
public class AudioTest : MonoBehaviour
{
public AudioSource audio;
private void Awake()
{
audio = GetComponent<AudioSource>();
audio.clip.LoadAudioData();
}
// Update is called once per frame
void Update()
{
if(Input.GetKeyDown(KeyCode.W))
{
audio.Play();
}
}
}
按下播放以后,注意到Profiler的Audio窗口,先是内存占用急剧增加,随即Cpu占用急剧增加,并且注意到当前帧的帧长达到了400ms,远超出达到60帧所需要的16.7ms,确实造成了卡顿
private void Awake()
{
audio = GetComponent<AudioSource>();
audio.clip.LoadAudioData();//提前加载音频
}
运行
注意到内存和CPU占用没有明显的波动,但是内存一开始就有51.8MB的占用,为了避免不必要的内存占用,我们应该在合适的时候卸载音频
audio.clip.UnloadAudioData();//卸载音频
在编辑器中勾选preload audio data即可自动预加载,勾选load in background可以在副线程中加载
双声道(3D音)对比单声道会占用两倍的内存,对于一些我们不希望实现近大远小效果的音频(比如背景音乐),可以设置为单声道(Mono),在音频资源中勾选Force to mono即可
可以看到修改为单声道以后Imported size变为2.7MB,对比之前减少了将近一半
Unity中自带了一个音频对象池(不了解对象池的同学请自行学习),打开ProjectSetting/Audio,可以看到max virtual voices和max real voices,前者代表池子大小,后者代表同时播放的声音数。一般来说人能分辨的声音数量是有限的,不需要同时播放很多音效,借助对象池可以帮我们进行限制。
在AudioSource中可以设置音频的最大和最小可以听到的距离,并且可以设置对应的曲线,超出一定距离后关闭不必要的音效能帮助减少cpu占用
基本上来说形状越复杂的碰撞体性能消耗越高,最简单(并且也是处理器开销最低)的碰撞体是原始碰撞体类型。在 3D 中,这些碰撞体为盒型碰撞体、球形碰撞体和胶囊碰撞体。在 2D 中,可以使用 2D 盒型碰撞体 和 2D 圆形碰撞体。
确定不会移动的物体建议勾选为static,因为Unity内部有优化,会将静态碰撞体的数据预加载在一个数据结构中以节省计算,对于静态碰撞体,不要在游戏运行时改变碰撞体的类型或移动它,如果你突然改变它,会重新进行大量计算
unity中的碰撞体如果一段时间没有发生移动和碰撞,就会进入休眠状态,当需要计算时,会立即醒来
使用设计模式,不要在Update里重复进行复杂的计算等。。。
性能优化的内容很多,随着你对unity的了解越深,你自然就能知道更多性能优化的方法。注意不要一味追求极限优化,如果当前已经达到你的目标配置和目标帧数,请将更多的精力放在其他方面。