场景异步加载场景中有点卡顿,改为一个异步加载

场景异步加载场景中有点卡顿,改为一个异步加载

项目场景:

在之前的项目中,甲方突然提供了更多的数据,测试加载场景有点卡顿。它被更改为异步加载场景进行过渡。避免过于生硬的加载等待。

问题描述:

实现了场景的异步加载后,总觉得我的加载有问题。虽然可以跳到主场景,就是感觉有点问题。

通过加载发现:

加载到100后会有卡顿时间,进度条直接从0变到100,一开始以为是测试场景太小了。

在这里插入图片描述

原因分析:

查了很多博文,发现有以下原因:

lol新版加载界面进度_unity 加载进度条_ue4加载地图进度

SceneManager.LoadSceneAsync() 不是真正的后台加载unity 加载进度条,它每帧加载一些资源;将 allowSceneActivation 设置为 false 后,Unity 只会加载到 90%,其余的会等到 allowSceneActivation 设置为 true 时才加载。加载到90的时候,我们人为的控制进度条的值是100%UI界面,但是实际上并没有加载,所以会卡住; floa 类型到 int 类型的转换规则:值会四舍五入到零,1.99 会返回 1,0.9 会返回 0,所以我的进度条直接从 0 变为 100unity 加载进度条,即为什么,它总是返回 0,

类型转换规则:

	当在int(假设int是32位的)、float和double格式之间进行强制类型转换时,原则如下:
	1.从 int 转换成 float,数字不会溢出,但是可能被舍入。
	.2从 int、float 转换成 double,能够保留精确的数值。因为 double 有更大的范围和更高的精度(有效位数)。
	3.从 double 转换成 float,因为 float 范围要小一些,所以值可能溢出成 +∞ 或 -∞。另外由于float精度较小,还可能被舍入。
	4.从 float、double 转换成 int,值将会向零舍入。如1.999会被转成1,-1.999会被转成-1。同时值可能会溢出。

解决方案:

lol新版加载界面进度_ue4加载地图进度_unity 加载进度条

注意这里 async.progress;返回 [0, 1] 之间的值。一开始我声明了一个int类型直接接收int endProgress = (int) async.progress;返回值始终为 0 ,所以存在进度条看起来怪怪的问题3D交通工具,这里我用 float 代替接收。

  	public Text text;
    public Slider slider;
    //异步加载
    IEnumerator LoadAsync()
    {
        AsyncOperation async = SceneManager.LoadSceneAsync(1);
        float nowProgress = 0;
        float endProgress = 0;

unity 加载进度条_lol新版加载界面进度_ue4加载地图进度

async1.allowSceneActivation = false; while (async1.progress < 0.9f) { endProgress = async.progress * 100f; while (nowProgress < endProgress) { ++nowProgress; slider.value = nowProgress / 100;

lol新版加载界面进度_ue4加载地图进度_unity 加载进度条

text.text = (int)(nowProgress) + "%"; yield return new WaitForEndOfFrame(); } } endProgress = 100; while (nowProgress < endProgress) { ++nowProgress;

lol新版加载界面进度_ue4加载地图进度_unity 加载进度条

slider.value = nowProgress / 100; text.text = (int)(nowProgress) + "%"; yield return new WaitForEndOfFrame(); } async1.allowSceneActivation = true; }

参考:场景的异步加载