协同程序
概念
在主程序运行的同时开启另一段逻辑处理,来协同当前程序的执行。
协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,但与其它协同程序共享全局变量等很多信息。
协程和多线程
协程不是多线程只是在模拟多线程
线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程。
而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行
Unity是否支持多线程
Unity可以开启多线程
但是在Unity中多线程不能使用渲染内容的API,比如修改坐标,修改文本内容等
开启协程
函数必须是协程函数
定义协程函数
返回值必须是IEnumerator
函数中必须有yield return或yield break
协同程序可以有参数
StartCoroutine("PrintA",4);
StartCoroutine(PrintA(4));(不建议使用,因为指定名称停止程序的方法不能用在该方法上)
IEnumerator ie = PrintA();---StartCoroutine(ie);
协程的运行影响
当脚本失活,协程继续运行
当物体失活,协程停止运行
当脚本或物体被删除的时候,协程停止运行
关闭协程
StopCoroutine()关闭指定协程
StopAllCoroutines()关闭所有协程
注意:无法使用StopCoroutine关闭StartCoroutine(PrintA(4));
yield
return null:等待一帧
yield return new WaitForSeconds(5):等待5秒
yield break 直接跳出协程
yield return 对象:等待某个对象完成某种操作,如下载,场景加载等
资源异步加载
Profiler:性能分析工具
卸载资源
Resouces.UnloadAsset()卸载指定资源:使用中的资源不能卸载 (通常不用)
Resouces.UnloadUnuserAssets():卸载所有未使用资源(切换场景时,默默卸载掉上一场景资源)
异步加载
Resources.LoadAsync
异步加载场景
SceneManager.LoadAsync(场景名字)
SceneManager.LoadAsync(场景索引)
AsyncOperation
异步加载过程中的信息
allowSceneActivation
场景加载完成后是否直接显示
isDone
加载完场景并且已经启用才为true
progress
allowSceneActivation=true 进度最高到1
allowSceneActivation=false 时 进度最高到0.9