Unity协程是一个可以暂停协程执行的函数,暂停后立即返回到主函数,并执行主函数的剩余部分unity 协程和线程区别,直到中断指令执行完毕,然后继续执行主函数的剩余函数从中断指令的下一行开始执行协程。 所有函数体执行完毕后,协程结束。
由于中断指令的出现,一个函数可以分成多个帧来执行。
协程的好处:
这样原本使用异步+回调方法编写的非人类代码可以以看似同步的方式编写。
能够逐步完成耗时的任务。 如果需要大量计算,可以将计算放在一个随时间运行的协程中处理,这样可以分散计算压力。
协程的缺点:
协程本质上是迭代器,并且基于 Unity 生命周期。 启动大量协程会导致gc
如果同时激活的协程过多,多个高开销的协程可能会被挤到同一个帧中,导致帧卡住。
编写协程时的性能优化:
一个常见的问题是直接new一条中断指令会带来不必要的GC负担。 您可以重用全局中断指令对象来优化开销。
协程在哪里执行?
协程通过迭代器实现函数。 在迭代器中unity 协程和线程区别,最关键的就是yield的使用。 这是实现协程功能的主要方式。 通过这个关键方法可以暂停协程的运行并记录下一次的时间。 开始时间和地点。
Yield也是脚本生命周期的一些执行方法。 不同的yield方法处于生命周期的不同位置:
产量返回空; 暂停协程并等待下一帧继续执行
yield 返回 0 或其他数字; 暂停协程并等待下一帧继续执行
产量返回新的 WairForSeconds(时间); 等待指定时间后继续执行
yield return StartCoroutine("协程方法名称"); 启动协程(嵌套协程)
产量返回游戏对象; 获取游戏对象后执行
yield return new WaitForFixedUpdate():等待直到下一个固定帧号更新
yield return new WaitForEndOfFrame():等待所有相机帧渲染完毕然后更新
产量突破; 跳出协程对应方法,后面的代码不会被执行。
yield return new WaitUntil(...) 根据定义暂停语句材质材料,直到指定的条件返回 true
Yield return new WaitWhile(…) 根据定义暂停语句,直到指定的条件返回 false
如何启动协程?
首先通过迭代器定义一个返回值为IEnumerator的方法,然后在程序中通过StartCoroutine启动一个协程:
在正式开始代码之前,需要了解一下StartCoroutine的两个重载方法:
StartCoroutine(string methodName):这是不带参数的情况。 直接通过方法名(字符串形式)启动协程
StartCoroutine(IEnumerator例程):以方法的形式调用,该方法可以带参数
StartCoroutine(string methodName, object value):通过方法名(字符串形式)+参数(参数类型而不是字符串)的方式调用带参数
如何结束协程?
StopCoroutine(string methodName):按方法名(字符串)执行
注意:如果使用StartCoroutine(string methodName)来启动协程,则只能使用StopCoroutine(string methodName)和StopCoroutine(Coroutineroutine)来结束协程。
StopCoroutine(IEnumerator例程):通过方法形式调用
StopCoroutine(Coroutineroutine):通过指定的协程关闭
StopAllCoroutines 暂停当前脚本下的所有协程
gameObject.active = false 可以停止该对象上所有协程的执行。 即使再次激活也无法继续执行。但注意MonoBehaviourenabled = false无法停止协程; 相反,当 MonoBehaviourenabled = false 时可以停止更新
原因:由于协程是在StartCoroutine时注册到GameObject上的,所以它的生命周期受到GameObject生命周期的限制,因此受到GameObject是否活跃的影响。
结论:虽然协程是在MonoBehvaviour(StartCoroutine)中启动的,但是协程函数的状态与MonoBehaviour完全处于同一级别,不受MonoBehaviour状态的影响。
协程结束的标志是什么?
如果最后一个yield返回的IEnumerator已经迭代到最后一个,MoveNext将返回false。 这时,Unity就会从协程列表中删除这个IEnumerator。
只有当该对象的 MoveNext() 返回 false 时3D角色,即 IEnumertator 的 Current 已经迭代到最后一个元素时,才会执行yield return 后面的语句。
协程的使用场景示例:
在帧中执行复杂的程序;
制作一个计时器;
异步加载等功能,如:
AB包资源异步加载
异步加载Resources资源
场景异步加载
WWW模块的异步请求
线程、进程和协程的区别:
进程有自己独立的堆和栈。 它既不共享堆也不共享堆栈。 该进程由操作系统调度。
线程有自己独立的栈和共享堆。 它们只共享堆,不共享栈。 线程也是由操作系统调度的(标准线程是一样的)。
与线程一样,协程仅共享堆而不共享堆栈。 协程由程序员在协程代码中显式调度。
一个应用程序一般对应一个进程。 一个进程一般有一个主线程和多个辅助线程。 线程是平行的。 协程可以在线程中启动。 协程是串行的。 一个脚本可以有多个协程,但同时只有一个协程在运行。
协程和线程的区别在于,协程避免了无意义的调度,这可以提高性能。 然而,程序员必须承担自己调度的责任。 同时,协程也失去了标准线程使用多个CPU的能力。 。
文章来源:https://blog.csdn.net/m0_56830697/article/details/130902045