目录
1. Unity是否支持多线程
2. Unity多线程的常用用法:
3. 什么是协程:
4. 协程和多线程的区别:
5. 协程函数的使用:
6.yield return
7. 协程受挂载对象和脚本失活销毁的影响:
1. Unity是否支持多线程
Unity支持多线程, 但是开的线程不能访问Unity相关对象的内容. 包括Unity中的所有方法.
Unity中, 自己新开的线程要主动销毁(一般写在OnDestory生命周期函数中 thread.Abort()). 否则新线程将和Unity编辑器共同存在, 直到关闭Unity编辑器.
2. Unity多线程的常用用法:
一般将可能造成卡顿的复杂算法或网络相关的代码让副线程执行. 将计算的结果存放在一个公共内存块中(比如Queue), 主线程从这个公共内存块中获取数据(if (queue.Count > 0)).
3. 什么是协程:
协同程序是一种分时分步执行的特殊函数. 本质是迭代器.
主要应用场景有: 异步加载文件, 异步下载文件, 场景异步加载, 批量创建时防卡顿.
4. 协程和多线程的区别:
多线程是一根独立的管道, 和主线程并行执行.
协程在主线程之上, 分时分步执行.
多线程
协程
5. 协程函数的使用:
继承MonoBehaviour的类都可以开启协程.
定义:
两个关键点: 1. 方法返回类型是IEnumerator及其实现类 2. 使用yield return返回
// 协程函数定义
IEnumerator MyCoroutine(string str1, string str2)
{
// 进入协程函数后立即打印str1
print(str1);
// 协程挂起, 等待5S后继续执行
yield return new WaitForSeconds(5f);
print(str2);
}
开启:
调用MonoBehaviour类中的公共方法StartCoroutine(IEnumerator ie).
// Start生命周期函数
void Start()
{
// StartCoroutine返回值为Coroutine
// 最好用一个Coroutine变量接受返回值, 用来关闭指定协程函数
Coroutine myCoroutine = StartCoroutine(MyCoroutine("pungn", "2333"));
}
关闭:
关闭所有协程函数: StopAllCoroutines();
关闭指定协程函数: StopCoroutine(Coroutine coroutine);
void Start()
{
// 关闭所有协程函数
//StopAllCoroutines();
// 通过变量名关闭指定协程函数
StopCoroutine(myCoroutine);
}
6.yield return
- yield return 任意数字;
yield return null;
下一帧执行. 在Update和LateUpdate之间执行.
- yield return new WaitForSeconds(float 秒数);
等待...秒后执行. 在Update和LateUpdate之间执行.
- yield return new WaitForFixedUpdate();
下个固定物理帧更新时执行. 在FixedUpdate和碰撞检测相关函数后执行.
- yield return new WaitForEndOfFrame();
在摄像机和GUI的相关渲染完成后执行, 截图功能通常使用. 在LateUpdate和之后的渲染相关处理完毕后执行.
- yield break
跳出协程 在跳出协程之后, 保存协程变量的参数会变成null.
7. 协程受挂载对象和脚本失活销毁的影响:
1.当挂载对象和脚本销毁后, 协程不执行
2.当挂载对象失活时, 协程不执行
3.当只有脚本失活时, 协程继续执行



