Unity游戏场景加载Loading详解

游戏中的Loading现在都做得很漂亮,但是归根究底就两种类型,静态Loading和动态Loading。
静态Loading可能就是一张背景图。而动态的Loading就是在读取的同时有一个东西在“转圈”。

1.静态Loading:
优点:读取场景使用同步的方法就可以,因为是同步方法所以读取的速度是最快的,也不用更新界面,因为同步执行方法的时候程序在等待读取结束。
执行Application.LoadLevel(“name”);同步方法来加载你的场景。

缺点:Loading的时候如果界面不动,那么用户体验肯定不佳,因为读取的时间如果过长用户就会误以为手机卡死了。其实我个人还是觉得最好用动态加载Loading的方式,虽然读取的时间没有静态Loading快,但是用户体验很好。

2.动态Loading:
优点:读取的时候界面可以有动画,甚至还可以做一些小游戏。场景可以异步加载,那么脚本上的Update就会每一帧都执行,所以就能做一些动态的东西。

缺点:没有缺点,嘿嘿,建议大家一定要使用动态loading、
执行 AsyncOperation async = Application.LoadLevelAsync(“MyBigLevel”); 方法就可以异步加载场景。

常见问题:

一. 游戏是否可以只做一个场景?

可以,而且我也看见过一些游戏只做一个场景,因为你所有的东西都可以动态加载来完成、比如场景模型、人物模型、场景烘培贴图等等。
执行 GameObject.Instantiate(“prefabName”) 方法来读取。
但是游戏只做一个场景有两个致命的问题。

1.Loading界面没动画或者动画很难看
因为有个办法可以有动画,比如把你的读取场景的方法拆成3个,用协同任务来依次执行这三个方法,因为协同任务没执行一个后,会调用一下所有脚本的Update,所以按照这个逻辑你界面的动画就可以动3下。。如果你真想这么干?我劝你还是早点放弃。因为你的同步方法不会拆分的那么均匀的,就算做出来了动画动的也会非常难看!!

2.内存的卸载完全需要你自己手工维护
Unity对读取的内存有一个缓存池的概念,如果你采用它的标准方式来切换场景,那么Unity会在切换场景的时候自动帮你把没有被引用的资源对象从内存中卸载掉。但是你现在是一个场景了,那么卸载内存的东西就要万全自己手工维护了。。

二.异步加载场景为什么最后会卡一下

这个罪魁祸首就是Unity不支持多线程。游戏加载被你分成了两部分、第一部分是加载场景,你可以把场景上已知的模型都保存在Scene上面,此时你在调用异步加载场景的时候会进度动画会非常的均匀。加载场景你可以理解成Unity自己在多线程加载,有可能他的后台也是同步,但是我们看不到源码从它的效果上来看它加载场景是多线程。

但是问题出在了第二步上,因为你需要加载未知模型,举个例子,当你进副本加载场景的时候,场景可不知道你身上带了那几个英雄。所以场景加载完毕后你还需要去加载的这些模型。无论你是用协同任务也好,还是在方法里面执行也好,因为Unity没有多线程,一般为了更快的能进游戏这里的加载都会选择同步加载,所以你会发现大部分游戏进度条加载到最后都会卡一下。
为了解决这个问题,在加载的时候一定要避免加载场景后自己写的哪个同步加载的方法,尽量让他执行更少的加载。

1.尽可能让场景多包含一些资源,我看有些人为了节省资源,打开场景以后动态的加载一些地面上的小物件。我觉得这种情况多做几个场景就可以了,不用在一个同步方法里出力过多的东西。

2.人物模型可以考虑预加载,也可以考虑常驻内存。。因为你的人物模型可能不止在战斗中才会被使用。

三、减少Loading的次数
尤其是战斗场景,重复挑战同一关卡的时候,因为场景没有变化,尽量就不要在去读取场景。所以你可以写一个加载的界面,根据当前场景名 和需要加载的场景名 如果场景相同 就不去加载, 如果场景不同再去加载,这样其实能省很多时间。

 1     //参数1 加载场景之前做的事情
 2     //参数2 新加载的场景名
 3     //参数3 加载场景后要做的事情
 4     public void LoadScene(System.Action before, string sceneName, System.Action end)
 5     {
 6         before();
 7         if(Application.loadedLevelName != sceneName)
 8         {           //异步加载场景, 加载完毕后 调用 end方法。
 9         }else
10         {
11             end();
12         }
13     }

官方API方法

1 public class ExampleClass : MonoBehaviour {
2     IEnumerator Start() {
3         AsyncOperation async = Application.LoadLevelAsync("MyBigLevel");
4         yield return async;
5         Debug.Log("Loading complete");
6     }
7 }
时间: 2024-10-03 22:54:06

Unity游戏场景加载Loading详解的相关文章

C编译器、链接器、加载器详解

摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作系统的启动代码和用到的库文件进行组织形成最终生成可加载.可执行代码的过程. 过程图解如下: 预处理器:将.c 文件转化成 .i文件,使用的gcc命令是

android DexClassLoader动态加载技术详解

介绍 做项目到一定庞大的时候就会发现方法数太多,安装包根本就装不上去了,这个也不足为奇,我们都知道当方法数目超过65536这个数目限制的时候,挡在2.x的系统上面就会出现无法安装的情况,这个时候动态加载技术就显得非的重要了,我们的项目中为了兼容2.x的手机也是用到了android的动态加载技术,这里我会详细的讲解一下怎么去用,怎么实战,我感觉,空谈理论不如动手来得实在. 实例 下面就通过一个例子反复的说明怎么来实现动态加载,通过不同的方法来调用. 准备工作 1:新建一个java工程(我比较懒我就

jquery插件图片延时加载实例详解(转)

jquery插件图片延时加载实例详解 效果预览:http://keleyi.com/keleyi/phtml/image/index.htm 使用方法:1.导入JS插件 <script src="http://keleyi.com/keleyi/pmedia/jquery-1.9.1.min.js" type="text/javascript"></script> <script src="http://keleyi.com/

Spring Boot 配置加载顺序详解

使用 Spring Boot 会涉及到各种各样的配置,如开发.测试.线上就至少 3 套配置信息了.Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发.测试.线上环境使用不同的配置. 在 Spring Boot 里面,可以使用以下几种方式来加载配置.本章内容基于 Spring Boot 2.0 进行详解. 1.properties文件: 2.YAML文件: 3.系统环境变量: 4.命令行参数: 等等-- 我们可以在 Spring Beans 里面直接使用这些配置文件中加载的值,如:

Unity实现场景加载渐入渐出效果

项目中要用到加载场景的时候有个渐入渐出的效果,做了一下,跟大家分享 首先,创建两个场景Main和Game场景: 其次,在Main场景中创建FandeScene.cs脚本,创建Fade空对象,挂载,给一张黑色的图片,拖成预设体,同样也拖到Game场景中. using UnityEngine; using System.Collections; public class FadeScene : MonoBehaviour {     public Texture blackTexture;     

mybatis懒加载特性详解,以及多对多映射详解

注意讲解都在代码中 准备数据库,测试数据,各位自己添加,因为是多对多,所以使用中间表: 用到的实体: 学生类: public class Student { private Integer sid; private String name; private Integer age; //一个学生有多个老师,一个老师有多个学生 private List<Teacher> teachers=new ArrayList<Teacher>(); setter.. getter.... to

图片延时加载例子详解

有时候由于图片太大,我们需要一个友好的提示,提示用户图片正在加载中,那么以下通过引入jquery就能轻而易举的实现. demo下载地址:http://download.csdn.net/download/tjcyjd/8475549 其中需要3个js:jquery.min1.7.1.js.jquery.lazyload.js.image.lazyload.js 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//

PHP命名空间与自动加载类详解

本文实例讲述了PHP命名空间与自动加载类.分享给大家供大家参考,具体如下: 今天我要给大家介绍的是PHP的命名空间 和 自动加载类 我先简单的分开演示 在放在一起 大家请看:什么是自动加载类? 想必大家都应该知道__autoload 这个魔术方法 $db = new DB();function __autoload($className){echo $className;exit();//在这个里面引用类} 在运用这个类只能加载一次 ,在很多时候我们要引入的不止一个类这个时候怎么办呢! 牛逼的p

插件化框架解读之Android 资源加载机制详解(二)

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680Android提供了一种非常灵活的资源系统,可以根据不同的条件提供可替代资源.因此,系统基于很少的改造就能支持新特性,比如Android N中的分屏模式.这也是Android强大部分之一.本文主要讲述Android资源系统的实现原理,以及在应用开发中需要注意的事项. 一.定义资源 Android使用XML文件描述各种资源,包括字符串.颜色.尺寸.主题.布局.甚至是