Unity性能优化(三)杂项优化与结语

目录

  • 一、音频优化
    • 1、音频预加载
      • 使用示例
        • 使用代码控制
        • 在编辑器中控制
    • 2、单声道与双声道
      • 效果对比
    • 3、音频对象池
    • 4、最远和最小距离
  • 二、碰撞体优化
    • 1、了解Collider的复杂度
    • 2、静态对象和静态碰撞体
    • 3、碰撞体的休眠机制
  • 三、代码优化
  • 四、总结

一、音频优化

1、音频预加载

当我们播放音频时,操作系统会将音频加载到内存中,然后从内存中播放,如果音频比较小,可能没什么影响,但是如果音频比较大,就会出现明显的卡顿。我们可以选择一个合适的时机(比如加载地图时),提前加载音频,这样播放的时候就能直接从内存里读取,避免卡顿。

使用示例

使用代码控制

编写一个按下按键播放音频的脚本,挂载到场景物体上
Unity性能优化(三)杂项优化与结语_第1张图片

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,确实造成了卡顿

Unity性能优化(三)杂项优化与结语_第2张图片
Unity性能优化(三)杂项优化与结语_第3张图片
在Awake中进行提前加载

private void Awake()
    {
        audio = GetComponent<AudioSource>();
        audio.clip.LoadAudioData();//提前加载音频
    }

运行
注意到内存和CPU占用没有明显的波动,但是内存一开始就有51.8MB的占用,为了避免不必要的内存占用,我们应该在合适的时候卸载音频
Unity性能优化(三)杂项优化与结语_第4张图片
Unity性能优化(三)杂项优化与结语_第5张图片

audio.clip.UnloadAudioData();//卸载音频
在编辑器中控制

在编辑器中勾选preload audio data即可自动预加载,勾选load in background可以在副线程中加载
Unity性能优化(三)杂项优化与结语_第6张图片

2、单声道与双声道

双声道(3D音)对比单声道会占用两倍的内存,对于一些我们不希望实现近大远小效果的音频(比如背景音乐),可以设置为单声道(Mono),在音频资源中勾选Force to mono即可
Unity性能优化(三)杂项优化与结语_第7张图片

效果对比

可以看到修改为单声道以后Imported size变为2.7MB,对比之前减少了将近一半
Unity性能优化(三)杂项优化与结语_第8张图片

3、音频对象池

Unity中自带了一个音频对象池(不了解对象池的同学请自行学习),打开ProjectSetting/Audio,可以看到max virtual voices和max real voices,前者代表池子大小,后者代表同时播放的声音数。一般来说人能分辨的声音数量是有限的,不需要同时播放很多音效,借助对象池可以帮我们进行限制。
Unity性能优化(三)杂项优化与结语_第9张图片

4、最远和最小距离

在AudioSource中可以设置音频的最大和最小可以听到的距离,并且可以设置对应的曲线,超出一定距离后关闭不必要的音效能帮助减少cpu占用

Unity性能优化(三)杂项优化与结语_第10张图片

二、碰撞体优化

1、了解Collider的复杂度

基本上来说形状越复杂的碰撞体性能消耗越高,最简单(并且也是处理器开销最低)的碰撞体是原始碰撞体类型。在 3D 中,这些碰撞体为盒型碰撞体、球形碰撞体和胶囊碰撞体。在 2D 中,可以使用 2D 盒型碰撞体 和 2D 圆形碰撞体。

2、静态对象和静态碰撞体

确定不会移动的物体建议勾选为static,因为Unity内部有优化,会将静态碰撞体的数据预加载在一个数据结构中以节省计算,对于静态碰撞体,不要在游戏运行时改变碰撞体的类型或移动它,如果你突然改变它,会重新进行大量计算
在这里插入图片描述
在这里插入图片描述

3、碰撞体的休眠机制

unity中的碰撞体如果一段时间没有发生移动和碰撞,就会进入休眠状态,当需要计算时,会立即醒来

三、代码优化

使用设计模式,不要在Update里重复进行复杂的计算等。。。

四、总结

性能优化的内容很多,随着你对unity的了解越深,你自然就能知道更多性能优化的方法。注意不要一味追求极限优化,如果当前已经达到你的目标配置和目标帧数,请将更多的精力放在其他方面。

你可能感兴趣的:(unity,性能优化,游戏引擎)