协程(coroutine)是一种用户态线程,与传统线程相比,协程是非抢占式的,可以由程序员控制线程的切换,因此可以在一个线程中执行多个任务,避免了线程的频繁切换和上下文切换的开销。
在协程内部,会维护一个相对独立的执行栈和寄存器上下文,每个协程可以有自己的状态,当协程执行遇到阻塞或者需要等待IO操作的时候,可以主动让出CPU,暂停自身,并根据需要恢复其他协程的执行。协程最常用的操作是yield,用于暂停当前协程的执行,并将控制权交给上层调用者,也可以将数据返回给调用者。另外一个常用的操作是send,用于恢复某个协程的执行,并传递数据给协程,以便协程根据数据继续执行。
Unity
中的协程由协程函数和协程调度器两部分构成.协程函数使用的是C#的迭代器, 协程调度器则利用了MonoBehaviour
中的生命周期函数来实现. 协程函数实现了分步, 协程调度器实现了分时.
Unity规定的协程返回值的含义
含义 | 代码 |
---|---|
下一帧再执行后续代码 | yield return null; yield retun x(x代表任意数字) |
结束该协程 | yield break; |
等待固定时间执行后续代码 | yield return new WaitForSeconds(0.3f); yield return new WaitForSecondsRealtime(0.3f); //不受timescale影响 |
函数执行完毕后执行后续代码 | yield return FunctionName(); |
异步执行完毕后执行后续代码 | yield return AsyncOperation; |
协程执行完毕后执行后续代码 | yield return Coroutine; |
帧渲染完成后执行后续代码 | yield return new WaitForEndOfFrame(); |
物理帧更新后执行后续代码 | yield return new WaitForFixedUpdate(); |
参数为true时执行后续代码 | yield return new WaitUntil(arg); |
参数为false时执行后续代码 | yield return new WaitWhile(arg); |
注: 为了优化性能,yield return 后面需要new的返回值应该预先创建, 而不是在协程函数中反复创建.
示例
Unity中的协程方法通过yield这个特殊的属性可以在任何位置、任意时刻暂停。也可以在指定的时间或事件后继续执行,而不影响上一次执行的就结果,提供了极大地便利性和实用性。
协程在每次执行时都会新建一个(伪)新线程来执行,而不会影响主线程的执行情况。
void Fade()
{
for (float f = 1f; f >= 0; f -= 0.1f)
{
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;
yield return null;//下一帧继续执行for循环
yield return new WaitForSeconds(0.1f);//0.1秒后继续执行for循环
}
}
评论区