协程是在什么地方执行?的使用方法有哪些?

协程是在什么地方执行?的使用方法有哪些?

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