Unity跨场景快速切换

本系列文章由抗痘洁面泥 出品,转载请注明出处。  



Unity快速切换场景的解决方法

最近项目在上线测试了之后,每次切换场景需要大概10s左右的时间,这样会导致用户体验很差,合作方想要的效果是达到像剑侠情缘那样的很快的切换速度,大概2秒左右就能把场景切换的效果。因为大多数游戏都会在加载场景的时候处理一些复杂逻辑,还有预加载人物等一系列操作,再加上场景本身也很大很复杂,所以要想达到很快的切换场景的还是很困难的。

1 查看加载场景的时候具体做了哪些事情

通过用profiler工具查看,发现在加载场景的时候由于场景的AB包依赖过多,有100多个依赖左右,所以加载这些AB包就消耗了1/2的总时间,其次是在场景切换的时候会发现有一项的耗时也比较高,是在加载完依赖后产生的Shader.CreateFromGPU的耗时也比较高,最后就是加载场景的耗时了,发现就是单独的加载场景的耗时是差不多2S左右的,如果能把依赖的加载,与Shader.Shader.CreateGpuProgram的耗时抹去,那么就能达到想要的效果了。

2 解决依赖的加载

因为我们为了让包体足够的小所有在打包的时候用的是LZMA的压缩方式,这种压缩方式优点是包体可以足够的小,缺点是在加载AB包的时候存在一个解压的操作,而使用LZ4的压缩方式的话包体会大一些,由于LZ4是按照块来读取的,不存在解压的操作,所以会更快点,所以我就把打包方式换成了LZ4,用了LZ4感觉切换场景的效果不是很明显,就想能不能把场景的AB包都预先全部加载出来
下图是AB文件的内部结构,我们可以看到里面的Assetbundle部分相当于是一个头文件,里面记录了关于这个AB的相关信息,当我们调用LoadFromFile接口加载AB的时候实际上就是去加载的这一部分信息,所以我们可以在登录的时候就把所有主场景的依赖AB都预先加载出来,这部分占用的内存可以在Profiler里面的SerilizeField选项里看到,我对所有10个主场景都做了这个操作,占用的内存大概是多了12M,这样处理之后加载速度确实快了很多,使用LZ4的效果也体现出来了。而且Shader.Shader.CreateGpuProgram的耗时也消失了,然后切换场景瞬间就很快了,2-3S就可以实现垮场景的操作了。但是Shader.Shader.CreateGpuProgram的耗时为什么会消失这是比较好奇的地方。

3 解决Shader.Shader.CreateGpuProgram产生的耗时

之所以会产生Shader.Shader.CreateGpuProgram主要是由于在加载和实例化之后,在相机的视域体中直接“渲染”一帧即可,这样会触发Unity引擎进行CreateGPU的操作,而这部分时间一般出现1~2次是不需要过多关注的,所以为了彻底解决这个问题,我在游戏初始化的时候把所有的Shader都加载出来,然后做了一次Shader.Find的操作,Shader.Find就相当于通知GLProgram链接Shader的一个过程。这样就可以解决了。


所以我们需要牺牲点内存,把场景的AB都加载出来做一个预加载的操作,但是能达到效果,而这些内存我们可以从其他地方挤出来,游戏开发就是这样需要在各种选择中取舍。

猜你喜欢

转载自blog.csdn.net/tc3819171/article/details/79145547