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和内存负荷而崩溃掉。通常这种情况下可以用一个布尔变量来避免灾难发生。

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

Unity3D中的Coroutine详解

Unity中的Coroutine原理猜测:虚拟机分段执行机制, 同类型嵌套用栈存放实现串行执行. Unity中使用yield Coroutine需要注意的问题...

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

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

StartCoroutine的学习记录

StartCoroutine的使用: IEnumerator  Wait(float waitTimeValue){ //things before wait yield return new Wai...

Unity3D: StartCoroutine 和 yield return 深入研究

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

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

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

Unity3d Coroutine的Start和Stop

StopCoroutine的几种方法:1.StopCoroutine(string method): StartCoroutine(“Test”); StopCor...

Unity3D 延时执行函数StartCoroutine

IEnumerator particleTrackWaitToSet(float fTime, bool bFlg) { yield return new WaitForSec...

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

在看别人代码的时候总是发现有个StartCoroutine(XXXXXX()),刚开始根本不明觉厉,只好查查单词。 Coroutine翻译过来是协同程序,那么什么是协同程序,又去百度了下,发现大多的...

IEnumerator/ IEnumerable/ yield return/ StartCoroutine 详解

IEnumerator/ IEnumerablepublic interface IEnumerable { IEnumerator GetEnumerator(); } ...

【学习笔记】Unity StartCoroutine 中 yield return 总结

Unity 中协程是个非常强大的功能,其作用主要是用于游戏中的延时调用或者执行一连串的有时间间隔的事件流程,例如剧情对话等。           看过几篇大佬的文章后,我简单总结了几点协程相关的知识点...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:StartCoroutine和yield的工作流程
举报原因:
原因补充:

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