StartCoroutine和yield的工作流程

原创 2015年07月10日 12:32:09

Yield 返回的是空值

如果yield 返回的是空(C#中是 yield return null, js中是yield),coroutine会被终止,控制权交回调用的位置,就像coroutine结束了一样——事实上它还处于活动状态。 下一帧 coroutine会自动在yield的位置执行,直到Coroutine结束为止。

举例:

Ienumerator Test()
{
    Print(Time.time); //第一次打印时间
    Yield return null;
    Print(Time.time); //第二帧时执行,所以时间要比第一次晚一些
}

如果yield 到另外一个coroutine, 控制权就会传递给这个coroutine,调用者的coroutine会被终止在这个yield直到被调用的coroutine结束

yield return StartCoroutine(AnotherCoroutine());

Yield返回的值非空

比如常见的

yield return new WaitForEndOfFrame();//等到该帧结束
yield return new WaitforSeconds(xxx);//等xxx秒
yield return new WaitForFixedUpdate();//等物理帧结束
yield return www;//这里www是一个WWW对象

总提来说,只要返回的值非空,yield 语句的作用就是让coroutine在这里暂停,主线程继续,直到yield的条件得到满足,再继续执行yield后面的代码。

有了这个认识,其实上面的四种情况都是一样的。
前三个分别是等到该帧结束、等xxx秒、等物理帧结束,其实都是满足了 new WaitForXXX的这个条件。而最后一个www,则是等www加载完成,也就是www可以访问了,条件满足了。

另外需要注意的是,每个开启的coroutine会在堆中分配一个对象,并且会一直存在直到结尾。在周期性的函数中(例如Update,FixedUpdate, LateUpdate)开启coroutine一定要警惕,因为你可能会平行运行数以千计的coroutine,占据大量内存空间。帧率会直降,Unity也可能会因为CPU和内存负荷而崩溃掉。通常这种情况下可以用一个布尔变量来避免灾难发生。

版权声明:请尊重原创内容,转载请注明来源及链接。

unity之StartCoroutine运行机制--懵逼了

不知今天大脑CPU转速不够还是怎么了,发现StartCoroutine的运行机制让我懵逼了!!! 简单概述一下:当update里的变量条件和 StartCoroutine();方法里的变量是同一个的话...
  • alayeshi
  • alayeshi
  • 2016年10月14日 20:03
  • 2242

Unity3D中的Coroutine详解

Unity中的Coroutine原理猜测:虚拟机分段执行机制, 同类型嵌套用栈存放实现串行执行. Unity中使用yield Coroutine需要注意的问题...
  • Blues1021
  • Blues1021
  • 2014年11月09日 23:29
  • 44776

StartCoroutine的学习记录

StartCoroutine的使用: IEnumerator  Wait(float waitTimeValue){ //things before wait yield return new Wai...
  • u013477973
  • u013477973
  • 2017年02月19日 16:20
  • 1287

关于UnityStartCoroutine(协程)的使用总结

StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程。 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的。这个时候可以使用协程来...
  • z358602955
  • z358602955
  • 2015年12月11日 11:02
  • 3394

StopCoroutine协程停止

StopCoroutine协程停止
  • aiyan1111111
  • aiyan1111111
  • 2017年01月08日 20:22
  • 3927

Unity3D: StartCoroutine 和 yield return 深入研究

StartCoroutine和yield return表面意思很好理解,StartCoroutine就是开启一个协程,yield return 是迭代器块返回调用迭代的地方。 是吧?不知道你什么感觉...
  • wangyao1052
  • wangyao1052
  • 2015年04月20日 20:31
  • 1403

Unity3D 延时执行函数StartCoroutine

IEnumerator particleTrackWaitToSet(float fTime, bool bFlg) { yield return new WaitForSec...
  • luoyikun
  • luoyikun
  • 2015年09月23日 21:49
  • 2191

协程--Coroutine小记

在unity中,协程是一个特殊的函数,它通过使用yield语句中断执行当前的代码,直到中断指令(YieldInstruction)结束后再接着之前的代码继续执行。 在C#中写协程需要遵循的规则有: ...
  • Willtom
  • Willtom
  • 2016年11月12日 10:08
  • 2143

Unity3d Coroutine的Start和Stop

StopCoroutine的几种方法:1.StopCoroutine(string method): StartCoroutine(“Test”); StopCor...
  • yanhui2012
  • yanhui2012
  • 2015年07月06日 15:54
  • 2205

我的游戏开发笔记(五):Coroutine及其用法

在看别人代码的时候总是发现有个StartCoroutine(XXXXXX()),刚开始根本不明觉厉,只好查查单词。 Coroutine翻译过来是协同程序,那么什么是协同程序,又去百度了下,发现大多的...
  • zhoushulun
  • zhoushulun
  • 2015年09月02日 13:21
  • 1174
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:StartCoroutine和yield的工作流程
举报原因:
原因补充:

(最多只允许输入30个字)