A coroutine is a function that is executed partially and, presuming suitable conditions are met, will be resumed at some point in the future until its work is done. → 协程是一个部分执行, 遇到条件 (yield return
) 会挂起, 直到条件知足才会被唤醒继续执行后面代码的一种函数.html
协程的做用一共有两点 :编程
1. 延时等待一段时间执行代码 2. 等某个操做完成以后再执行后面的代码
总而言之, 协程控制了代码在特定的时机执行, 是对单线程控制权的交替.数据结构
Coroutines 不是多线程, 不是异步技术, 协程都在 MainThread 中执行, 并且每一个时刻只有一个 Coroutine 在执行. Coroutine 是一个 function, 能够部分执行, 当条件知足时, 将来会被再次执行直到整个函数执行完毕.多线程
协程可以把一个计算或操做,分解成若干步,而且能够在任何一步停下来,并在须要的时候继续执行剩下的步骤。这样的模型给予了更细粒度的控制一个操做或是功能, 好比, 一个很是耗时间的操做, 被分步执行能够更好的控制程序响应. 好比, 一个操做须要依赖各类条件, 能够更好的处理条件不知足的时候的状况. 也可以更好的把操做或是计算过程当中的状态变化, 与其余的状态变化交互, 然而, 程序运行的过程就是抽象数据结构和结构不断变化的过程, 协程可以优雅天然的进行这个变化过程的需求.并发
Unity 在每一帧都会去处理 GameObject 里带有的 Coroutine Function, 直到 Coroutine Function 被执行完毕. 当一个 Coroutine 开始启动时, 它会执行到遇到 yield 为止, 遇到 yield 的时候 Coroutine 会暂停执行, 直到知足 yield 语句的条件, 会开始执行 yield 语句后面的内容, 直到遇到下一个 yield 为止 ... 如此循环直到整个函数结束, 这就是能够将一个函数分割到多个帧里去执行的思想.异步
也就是说, Coroutines 最棒的就是函数的执行能够不在一次 Frame 里完成, 能够在多个 Frame 中完成. 好比, 咱们但愿看到物体透明度的改变, 若是让 color.a 的变化在一帧内完成, 那么咱们是看不出来这其中的变化得, 由于太快, 因此让 color.a 的变化必须在多个帧内完成, 咱们才有可能用肉眼看到这一变化的过程.函数
Unity 的协程系统基于 C# 的接口 : IEnumerator, 容许为本身的集合类型编写枚举类.ui
历史上先有的协程, 是操做系统用来模拟多任务并发, 协程是非抢占式的, 多任务时间片不能公平分享, 线程是抢占式的;url
线程能利用多核达到真正的并行计算, 若是任务设计的好, 线程能几乎成倍的提升你的计算能力, 可是线程的缺点也很明显, 那就是没有设计好致使大量的锁 | 切换 | 等待, 这些不少都是应用层的问题. 而协程由于是非抢占式, 因此须要用户本身释放使用权来切换到其余协程, 所以同一时间其实只有一个协程拥有运行权, 至关于单线程的能力.操作系统
协程相对线程的最大优势就是 : 让原来要使用异步 + 回调方式写的非人类代码, 能够用看似同步的方式写出来.
- 协程是 C# 线程的替代品, 是 Unity 不使用线程的解决方案. 可是, 协程不是线程, 不能进行异步执行, 协程和 MonoBehaviour 的 Update 函数同样也是在 MainThread 中执行的. - 使用协程不用考虑同步和锁的问题. - 在程序中调用 StopCoroutine() 方法只能终止以字符串形式启动(开始)的协程; - 多个协程能够同时运行,它们会根据各自的启动顺序来更新; - 协程能够嵌套任意多层; - 若是你想让多个脚本访问一个协程,那么你能够定义静态的协程; - 协程不是多线程(尽管它们看上去是这样的),它们运行在同一线程中,跟普通的脚本同样; - 若是你的程序须要进行大量的计算,那么能够考虑在一个随着时间进行的协程中处理它们; - IEnumerator 类型的方法不能带 ref 或者 out 型的参数,但能够带被传递的引用; - 目前在 Unity 中没有简便的方法来检测做用于对象的协程数量以及具体是哪些协程做用在对象上。 - 协程能够减小 callback 的使用, 可是不能彻底替换 callback. 基于事件驱动的编程里面反而不能发挥协程的做用, 而用 callback 更适合. 想象一下用协程来写 GUI 的事件处理你怎么写, 计算密集型的异步代码里面也只能用 callback. 而 NodeJs 那种 io 瓶颈单任务流程用协程的确很适合, 可是也须要 callback 做补充. - 状态机用协程其实也有问题, 好比状态里面嵌套子状态, 再由子状态切换到其余状态的子状态, 开销和代码都会变差, 反而不如经典的状态机简单明了高效.
Book <<Unity Case Study Manual>>
http://blog.csdn.net/u010153703/article/details/38557237
http://blog.csdn.net/huang9012/article/details/38492937
https://www.zhihu.com/question/20511233?rf=23290260
https://www.zhihu.com/question/20511233
End.